我正在MVVM中进行第一个项目,因此我选择使用MVVM Light Toolkit。我GameViewModel在游戏的主屏幕上可以处理业务。我需要找出如何在执行命令时AdventurerView使用实例Adventurer作为参数打开新窗口(),将其绑定到AdventurerViewModel,以及显示和返回数据。该窗口的实例将经常打开和关闭。我已经坚持了几天,这让我发疯。我想学习如何以MVVM友好的方式进行此操作,最好使用MVVM Light或纯XAML提供的工具。
GameViewModel
AdventurerView
Adventurer
AdventurerViewModel
我试过使用MVVM Light,ViewModelLocator但是由于AdventurerView它是一个窗口,因此无法使用;尽管程序仍在编译和运行,但它显示“无法以样式放置窗口”。我可以进行一些更改以使其正常工作吗?还是有其他方法可以将它们绑定到XAML中?还是完全采用另一种方法?我真的很希望能够继续前进。我也尝试过使用MVVM Light的Messenger毫无用处(仍然无法解决View / ViewModel问题)。
ViewModelLocator
我只需要能够创建绑定到的窗口AdventurerViewModel并显示/返回适当的数据。
目前,AdventurerView.xaml处于其默认状态,但我认为,如果我可以绑定可能有用的适当数据(DataContext)。
AdventurerViewModel也相当准
class AdventurerViewModel : ViewModelBase { #region Members private Adventurer _adv; #endregion #region Properties public Adventurer Adv { get { return _adv; } set { _adv = value; } } #endregion #region Construction public AdventurerViewModel(Adventurer adv) { this._adv = adv; } #endregion }
App.xaml,底部的无效DataTemplate:
<Application StartupUri="MainWindow.xaml" xmlns:views="clr-namespace:AoW.Views" xmlns:vm="clr-namespace:AoW.ViewModels" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="AoW.App" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Application.Resources> <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> <DataTemplate DataType="{x:Type vm:GameViewModel}"> <views:GameView /> </DataTemplate> <DataTemplate DataType="{x:Type vm:TitleViewModel}"> <views:TitleView /> </DataTemplate> <DataTemplate DataType="{x:Type vm:AdventurerViewModel}"> <views:AdventurerView /> </DataTemplate> </Application.Resources> </Application>
里面的命令GameViewModel有望使所有这些事情发生(消息框仅确认该命令正在触发):
private void ExecuteShowAdvCommand(Adventurer adv) { System.Windows.MessageBox.Show(adv.Name); }
我真的不知道还包括什么。
好吧,我整理了一个演示,它应该可以使您更轻松地下载链接
功能性:
MainWindow
ModalWindow
NonModalWindow
TextBox
TextBlock
CheckBox
就功能而言,就是这样
概念:
SimpleIoC
GetInstance(...)
OpenWindowMessage
重要说明:* -在此示例中,用于DialogResult从模态窗口设置非DP 的方法不是MVVM友好cos,它使用代码隐藏来设置 应 避免DialogResult的Window.Closing事件的属性(如果需要“可测试”)。我偏爱的方法有点长,并且在此处(问题与答案的混合物)有很好的记录。因此,为什么为了这个示例而忽略它。 *
DialogResult
Window.Closing