我有一个使用mvvm模式的WPF应用程序,我需要从我的主视图模型中显示一个对话框。
我有一个第二个视图,它的视图模型,我认为我有两个选项来创建对话框。
选项1
在主体视图模型中,我可以执行以下操作:
选项2
在主视图模型中:
在对话框的视图模型的构造函数中:
我知道在MVVM中,视图模型不需要了解视图,但是在第二个选项中,在实践中,视图模型如何没有任何链接到视图的属性,只是在构造函数中创建一个显示,在最后的状态中,视图模型对视图一无所知。
但是,我认为主体视图中的代码更清晰,因为我只需要创建视图模型,只需要一行代码,而不是需要4行的选项1(创建视图、创建视图模型、将视图模型分配到视图并显示对话框)。
如果我想要遵循mvvm模式,认为第二个选项不是一个坏主意,我是否错了?
发布于 2013-04-03 07:41:07
我在wpf中为对话框做这。
var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);
... do anything with the dialog result...发布于 2013-04-03 07:40:51
与大多数情况一样,有几种实现解决方案的方法。
对于具有多个对话框、窗口或页面的大型应用程序,最好的方法是提供服务,例如IDialogHandler。通过c_tor提供给虚拟机。您可以在这个帖子中找到一个例子。
最大的优点是解耦,这使得VM易于测试,因为它们没有对视图的引用。
对于具有2或3个不同对话框的较小应用程序,下面的方法也是适当的。
public class DialogView : Window
{
// a method to create easily a dialog
public static void ShowDialog(DialogViewModelBase dialogVm)
{
var dialog = new DialogView { DataContext = dialogVm };
dialog.ShowDialog(); // pls note, that this will create a modal dialog
}
}因此,DialogView.ShowDialog(...)可以从任何地方调用。但是在这里,VM有对视图的引用。
这类似于您的选项1,很好,步骤顺序不一样,但已经足够接近了。
发布于 2013-04-03 08:32:19
不管你选择哪种方式,都有一个麻烦。
坦率地说,它不仅与对话有关,而且与所有窗口有关。在MVVM中,这会成为一种真正的痛苦。至少对于我们的团队,当我们同时使用WinForms和WPF时。
大多数开发人员忘记了windows的父子关系。
关于对话框窗口,这会导致一些糟糕的UX:对话框有可能在主窗口下面,因为显示的对话框没有响应。(你可以很容易地还原它)。
因此,在MVVM中,您需要以某种方式设置父级。这里最重要的是,这个视图不需要一个窗口。
这是我们怎么做的。
我们提出了视图模型-第一方法。但是我们没有在VM中注入View。我们传递IViewService,这是可修复的视图实例化,父子关系和监听一些事件.
当用户点击右上角的时候,想想你的虚拟机如何阻止它的视图关闭。
https://stackoverflow.com/questions/15781149
复制相似问题