2

我有一个使用模式的 WPF 应用程序,我需要从我的主视图模型中显示一个对话框。

我有一个带有视图模型的辅助视图,我认为我有两个选项来创建对话框。

选项1

在主视图模型中,我可以执行以下操作:

  1. 创建对话框的视图
  2. 创建对话框的视图模型
  3. 将视图模型分配给视图
  4. 显示对话框

选项 2

在主视图模型中:

  1. 创建对话框的视图模型

在对话框的视图模型的构造函数中:

  1. 创建对话框的视图
  2. 将视图模型分配给视图。在这种情况下分配“this”
  3. 显示对话框

我知道在 MVVM 中,视图模型对视图一无所知,但在第二个选项中,实际上,视图模型没有任何链接到视图的属性,只是在构造函数中创建一个显示,在最终状态视图模型对视图一无所知。

不过我觉得principal view里面的代码比较清晰,因为我只需要创建view model,只需要一行代码,而不是option 1需要4行(create view, create view model, assign视图模型到视图并显示对话框)。

如果我想遵循模式,我认为第二个选项不是一个坏主意,我错了吗?

4

3 回答 3

1

在大多数情况下,有几种方法可以实现解决方案。

对于具有多个对话框、窗口或页面的大型应用程序,最好的方法是服务,例如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(...)可以从任何地方调用。但是这里的虚拟机有对视图的引用。
这类似于您的OPTION 1,好吧,步骤顺序不一样,但它足够接近。

于 2013-04-03T07:40:51.300 回答
1

我为 wpf 中的对话框执行此操作

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);

... do anything with the dialog result...
于 2013-04-03T07:41:07.903 回答
1

无论您选择哪种方式,都会有一个麻烦。
坦率地说,它不仅与对话有关,而且与所有窗口有关。而在 MVVM 中,这可能会成为一种真正的痛苦。至少对于我们的团队来说,当我们同时使用 WinForms 和 WPF 时。

大多数开发人员忘记了窗口的父子关系。
关于对话框窗口,这会导致用户体验有些差:对话框可能位于主窗口下方,由于显示的对话框而无响应。(您可以轻松地复制它)。

因此,在 MVVM 中,您需要以某种方式设置父级。这里重要的是,View 不一定是 Window。

这里我们如何做到这一点。
我们更喜欢 ViewModel-first 方法。但是我们不会在 VM 中注入 View。我们传递 IViewService,它负责 View 实例化、父子关系和监听某些事件。
想想当用户单击右上角的十字时,您的虚拟机如何阻止其视图关闭。

于 2013-04-03T08:32:19.400 回答