我有一个WPF应用程序,我试图以MVVM模式实现(尽可能多)。我的一个视图模型打开一个子窗口,其代码如下:
SomeChildWindow childWin = new SomeChildWindow();
childWin.DataContext = someChildViewModel;
childWin.ShowDialog();
我遇到的问题是我在SomeChildWindow
中使用的路由命令未收到:
<Button Content="Do Work" Command="root:GlobalCommand.DoWork"/>
GlobalCommand
是一个静态类,DoWork
是一个RoutedUICommand。我有DoWork
绑定到我的主视图模型,代码如下:
//Method inside the main view model
public void BindGlobalCommands(Window win)
{
win.CommandBindings.Add( new CommandBinding
( GlobalCommand.DoWork, (s, e) => { this.DoSomeWork(); } ) );
}
我做了一些研究,我很确定我遇到的问题与问这个问题的人有同样的问题:WPF Routed Commands and ShowDialog Windows。但是,提供给该问题的答案要求父视图模型直接了解自己的视图,而我的视图并不是
我是否以正确的MVVM方式生成窗口?
如何在我的子窗口中使用RoutedCommand
?
答案 0 :(得分:0)
对于对话框,我创建了单独的ViewModel,它们可以是主ViewModel的一部分。
主ViewModel实例化对话框的VM,创建Dialog,设置DataContext并等待对话框关闭(如果是模态)
Dialog使用对话框的ViewModel上的命令。
一旦Dialog关闭,主ViewModel会查看Dialog(Yes,No,Cancel,Ok,...)的结果,该结果可以是对话框VM的属性。基于此结果,主VM然后使用对话框的内容来执行某些命令。
通过这种方式,对话框可以重复使用,主VM可以继续控制。