我正在WPF中实现MVP / M-V-VM,到目前为止我还好运。但是,我没有看到此模型如何支持实现模态对话框。我从Crack.NET(http://www.codeplex.com/cracknetproject)中获得了我的工作,以了解这些东西是如何工作的。
我有一个ShellView视图(只是XAML),上面有一个菜单。该菜单绑定到ShellModelView中显示“EditPreferences”的命令。
ShellModelView为EditPreferences实现ICommand,在这里我们想要设置一个对话框,让用户编辑应用程序的首选项。
这里有几个问题: 1. ShellModelView没有对ShellView的引用来正确地为对话框提供父级。 ShellModelView是ShellView的DataContext,但我没有看到设置的反向引用。 2.无论如何,ShellModelView不应该加载显式UI。那么这里适当的交互模型是什么? 3.如何构建我的PreferencesDialog,以便在逻辑和视图之间正确分隔? PreferencesDialog本身需要是一个Window,因此您可以在其上调用ShowDialog,但这意味着您需要对Window(例如View)的引用才能实例化它。理想情况下,我应该能够在PreferencesDialog中对代码/验证进行单元测试,而无需实例化视图(可能使用Mock视图?)。
答案 0 :(得分:6)
也许这不是查看它的合适方式,但这是我在WPF中使用M-V-VM的方法。打开窗口和对话框或“EditPreferences”视图是UI特定的功能。如果我要重写整个UI来替换所有视图,我可能最终将“EditPreferences”视图与另一个视图结合起来,因此永远不想在另一个屏幕中打开它。如果这与ViewModel绑定,则很难绕过。在这种特殊情况下,我的“ShellView”中有一个按钮或菜单项,它创建了我的“EditPreferences”视图的新实例,然后传入“EditPreferences”ViewModel,它可能来自我的“ShellViewModel”中的属性“或者我的”EditPreferences“视图可以实例化ViewModel本身。
以下是关于SO的类似问题基本上说同样的事情:M-V-VM Design Question. Calling View from ViewModel
答案 1 :(得分:1)
您需要一个控制器。控制器应负责显示首选项对话框窗口。
正如我可以设想的那样,控制器应该负责为它创建ShellModelView和绑定视图的DataContext。控制器还应负责处理EditPreferences的命令执行。在执行逻辑中,控制器将创建一个新的PreferencesDialog及其相应的视图模型。
如果您尚未在Prism中找到类似的模式,则可以找到它们。您还可以重用那里提供的DelegateCommand:)
答案 2 :(得分:1)
让PreferencesDialog实现一个接口,该接口是EditPreference命令的属性之一。该命令将通过界面与对话框交互。对于单元测试,模拟对象将实现接口。
然后,对话框类可以驻留在最高层。
答案 3 :(得分:0)
我的2美分是:
将某种viewfactory契约作为命令参数传递或将viewfactory契约注入视图模型。视图模型将使用viewfactory创建它需要的任何模态/非模态视图。 viewfactory还可以将其Show / ShowModal方法的参数作为要显示的视图模型。此外,viewfactory可以使用datatemplate显示作为参数传入的任何viewmodal。
将ShowViewModel属性添加到相关的viewmodel。然后,DataTrigger可以监视此属性,当它属于特定类型时显示视图等。