MVVM Light&WPF – 将Window的多个实例绑定到ViewModel
我正在研究MVVM中的第一个项目,我选择使用MVVM Light Toolkit。 我有一个GameViewModel
,可以在我的游戏主屏幕上处理业务。 我需要找到如何在执行命令时将Adventurer
实例作为参数打开一个新窗口( AdventurerView
),将其绑定到AdventurerViewModel
,以及显示和返回数据。 此窗口的实例将经常打开和关闭。 我已经被困在这几天了,这让我发疯了。 我想学习如何以MVVM友好的方式执行此操作,最好使用MVVM Light或纯XAML提供的工具。
我尝试过使用MVVM Light的ViewModelLocator
但是因为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:
GameViewModel
中的命令将有希望使这一切发生(消息框只是确认命令正在激活):
private void ExecuteShowAdvCommand(Adventurer adv) { System.Windows.MessageBox.Show(adv.Name); }
我真的不知道还包括什么。
好的,我整理了一个演示版本,可以让您更轻松地下载链接
function:
- 3 Windows总计(
MainWindow
,ModalWindow
,NonModalWindow
) -
MainWindow
有一个TextBox
你可以输入你想要的任何内容。 - 顶部的2个按钮将相应打开Modal / NonModal窗口
- 打开时,每个窗口都会在其中的
TextBlock
显示MainWindow的TextBox
中的消息。 - 在每个窗口中,您可以勾选一个
CheckBox
来更新MainWindow
中结果文本块中的值(对于模态窗口,这将在模态窗口关闭时启动。对于NonModal更改可以看作asap)
这就是function,
概念:
- 使用
GetInstance(...)
注册多个VM并使用GetInstance(...)
来请求它们。 - 具有自定义消息类型
OpenWindowMessage
Messenger类用法 - 从父虚拟机开始模态/非模态Windows,坚持MVVM原则
- 在窗口之间传递数据(仅在NonModal中显示)
重要说明: – 此示例中用于从模式窗口设置非DP DialogResult
的方法不是MVVM友好的,因为它使用代码隐藏来设置应该避免的Window.Closing
事件上的DialogResult
属性(如果需要的话) “可测”)。 我喜欢的方法有点长,在这里有很好的记录(问答的混合)。 因此,为什么我为了这个样本而忽略了它。
跟进Viv,我修改了示例以包含打开窗口而不使用后面的代码的示例。
示例项目在这里。
我正在使用ViewModelLocator单例和静态方法,该方法用于通知视图模型和窗口以及数据上下文而不是后面的代码。
博客文章详细信息。 让我知道哪种方法更可取。 我不喜欢使用背后的代码,但可能有专业人士和骗子我不知道。