我正在开发我的第一个 MVVM 项目,我选择使用 MVVM Light Toolkit。我有一个GameViewModel
在我的游戏主屏幕上处理业务的。我需要了解如何在执行命令时AdventurerView
以 的实例Adventurer
作为参数打开一个新窗口 ( ),将其绑定到AdventurerViewModel
,并显示和返回数据。此窗口的实例将经常打开和关闭。我已经坚持了几天了,这让我发疯了。我想学习如何以对 MVVM 友好的方式执行此操作,最好使用 MVVM Light 或纯 XAML 提供的工具。
我尝试过使用 MVVM Light ViewModelLocator
,但因为AdventurerView
它是一个窗口,所以它不起作用;它说“不能在样式中放置一个窗口”,尽管程序仍然可以编译和运行。有没有什么我可以改变的东西来完成这项工作?还是有另一种方法可以在 XAML 中绑定它们?或者完全是另一种方法?我真的很想能够从此继续前进。我也尝试过使用 MVVM Light 的 Messenger 无济于事(仍然无法解决 View/ViewModel 问题)。
我只需要能够创建一个绑定到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);
}
我真的不知道还要包括什么。