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