【问题标题】:Model-View-Presenter and Modal Dialog boxes.... How to?Model-View-Presenter 和 Modal 对话框.... 如何?
【发布时间】:2008-11-24 19:33:53
【问题描述】:

我正在 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 视图?)。

【问题讨论】:

标签: wpf design-patterns mvvm mvp


【解决方案1】:

也许这不是看待它的适当方式,但这是我在 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

【讨论】:

    【解决方案2】:

    您需要一个控制器。控制器应负责显示首选项对话框窗口。

    正如我所想象的,控​​制器应该负责创建 ShellModelView 并将视图的 DataContext 绑定到它。控制器还应该负责处理 EditPreferences 的命令执行。在执行逻辑中,控制器将创建一个新的 PreferencesDialog 及其对应的视图模型。

    如果您还没有这样做,您可以在Prism 中找到类似的模式。您还可以重用那里提供的 DelegateCommand :)

    【讨论】:

      【解决方案3】:

      让 PreferencesDialog 实现一个接口,该接口是 EditPreference 命令的属性之一。该命令将通过界面与对话框交互。对于单元测试,模拟对象将改为实现接口。

      然后对话框类可以驻留在您的最高层。

      【讨论】:

      • 我认为 MVVM 的目标之一是实现不让 ViewModel 了解有关视图(或示例中的对话框)的事情?这样任何数量的视图(或没有)都可以随时使用视图模型。让您的 ViewModel 在 View 界面上设置东西有点破坏了这一点。
      • 这不是因为接口将命令与对话框的实现隔离开来。
      • 这是 MVP 模式。更改建议的 View 界面会破坏 ViewModel,例如更改方法的签名或属性的类型,BAM 你刚刚破坏了依赖于接口的 ViewModel。在 MVVM 中,视图通过绑定“观察”视图模型。对 View 进行更改(例如添加控件)不需要更改接口,甚至不需要重新编译 ViewModel。很酷的是,一个 ViewModel 可以被许多 View '观察'。如果您对此更感兴趣,请参阅 GOF 书中的观察者模式并阅读 Prism 文档部分“演示模型”:)
      【解决方案4】:

      我的 2 美分是:

      1. 将某种 viewfactory 契约作为命令参数传递,或者将 viewfactory 契约注入到视图模型中。视图模型将使用 viewfactory 来创建它需要的任何模态/非模态视图。 viewfactory 还可以将要显示的视图模型作为其 Show/ShowModal 方法的参数。此外,视图工厂可以使用数据模板来显示作为参数传入的任何视图模式。

      2. 将 ShowViewModel 属性添加到相关视图模型。然后,DataTrigger 可以监视此属性,并在它属于特定类型时显示视图等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多