我正在MVVM中进行第一个项目,我选择使用MVVM Light Toolkit。 我有一个 GameViewModel 处理我的游戏主屏幕上的业务。 当执行命令时,我需要找到如何打开一个新的窗口(AdventurerView),并传递 Adventurer 的实例作为参数,将其绑定到 AdventurerViewModel,并显示和返回数据。这个窗口的实例会频繁地打开和关闭。 我已经陷入了这个问题几天了,让我感到非常疯狂。 我想学习如何以MVVM友好的方式做到这一点,最好是使用MVVM Light提供的工具或纯XAML。
我尝试过使用 MVVM Light 的 ViewModelLocator,但由于 AdventurerView 是一个窗口,它不起作用; 它会说“无法在样式中放置窗口”,尽管程序仍然编译和运行。有没有什么我可以改变使其工作? 或者有没有其他方法在 XAML 中绑定它们? 或者完全另一种方法? 我真的很想能够解决这个问题。我也尝试过使用 MVVM Light 的 messenger,但是没有成功(它仍然没有解决视图/视图模型的问题)。
我只需要能够创建一个绑定到 AdventurerViewModel 的窗口并显示/返回适当的数据即可。
目前 AdventurerView.xaml 处于其默认状态,但我认为如果我能绑定适当的数据,那可能有所帮助(DataContext)。
AdventurerViewModel 也非常简洁。
我尝试过使用 MVVM Light 的 ViewModelLocator,但由于 AdventurerView 是一个窗口,它不起作用; 它会说“无法在样式中放置窗口”,尽管程序仍然编译和运行。有没有什么我可以改变使其工作? 或者有没有其他方法在 XAML 中绑定它们? 或者完全另一种方法? 我真的很想能够解决这个问题。我也尝试过使用 MVVM Light 的 messenger,但是没有成功(它仍然没有解决视图/视图模型的问题)。
我只需要能够创建一个绑定到 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
}
底部为无法工作的DataTemplate的App.xaml:
<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);
}
我不太清楚还有什么其他的要包括。
在IT技术方面,您需要做些什么?
Messenger
吗?简单来说,你首先不需要在MainWindow的xaml中将一个新窗口声明为DataTemplate
。你需要做的是,在GameViewModel
中当你需要创建AdventureView
时,向MainWindow
发送一条消息,该消息应该在代码后台注册和接收,创建AdventureView
并适当地调用Show()
或ShowDialog()
。SimpleIoC
应该处理AdventureViewModel
的VM创建。这对你有意义吗? - VivMessenger
将结果发送回GameViewModel
。 - VivMessenger.Default.Register<MyMessage>(this, (args) => /* Do something with args parameter */);
。在这个例子中,我假设MyMessage
类有一个名为SomeProp
的字符串属性。MVVM Light 自带一些内置的消息类型。请查看此文章 http://www.galasoft.ch/mvvm/ 中的 Messenger 部分。 - Viv