MVVM Light和WPF-将窗口的多个实例绑定到ViewModel
我正在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);
}
我真的不知道还包括什么。
回答:
好吧,我整理了一个演示,它应该可以使您更轻松地下载链接
- 3窗户在总(
MainWindow
,ModalWindow
,NonModalWindow
) MainWindow
有一个TextBox
您可以输入任何内容。- 顶部的2个按钮将相应地打开“模态/非模态”窗口
- 每个窗口在打开时都将
TextBox
在其TextBlock
内部显示MainWindow中的消息。 - 在每个窗口中,您都可以在中打勾a
CheckBox
来更新结果文本块中的值MainWindow
(对于模态窗口,将在模态窗口关闭时启动。对于非模态更改,可以尽快看到)
就功能而言,就是这样
- 向
SimpleIoC
和注册多个VM 并GetInstance(...)
用于请求它们。 - 使用自定义消息类型的Messenger类用法
OpenWindowMessage
- 从父VM打开Modal / Non Modal Windows,这与MVVM原理保持一致
- 在窗口之间传递数据(仅在NonModal中显示)
避免DialogResult
的Window.Closing
事件的属性(如果需要“可测试”)。我偏爱的方法有点长,并且在此处(问题与答案的混合物)有很好的记录。因此,为什么为了这个示例而忽略它。
*
以上是 MVVM Light和WPF-将窗口的多个实例绑定到ViewModel 的全部内容, 来源链接: utcz.com/qa/434536.html