创建MVVM友好对话策略

时间:2011-07-06 11:00:19

标签: c# wpf mvvm mvvm-light

我正在尝试创建一个处理弹出窗体的策略,以便在我的应用程序的任何部分使用。到目前为止,我的理解是我需要在MainWindow的根目录中使用一个UserControl。这将绑定到自己的ViewModel,它将处理在应用程序中发送的消息。

我正在使用MVVM Light,而且我对Messenger类很新。

想象一下Master / Details场景,其中一个对象列表包含在ListBox中。选择其中一个项目并单击“编辑”按钮将显示覆盖整个屏幕的UserControl。然后,用户可以编辑所选项目,然后单击“确定”以提交更改。

我希望打开的UserControl是“通用的”,我可以在其中抛出任何(可能是ViewModel)......它通过DataTemplate呈现ViewModel并处理所有对象更改。单击“确定”将回调发送类并像以前一样保留更改。

某些有用的情况是......

  1. 显示没有必要用户输入的错误消息(除了可以关闭它之外)
  2. 显示数据项的编辑表单
  3. 确认对话框(很像标准的MessageBox)
  4. 任何人都可以提供我如何实现这一目标的代码示例吗?

3 个答案:

答案 0 :(得分:21)

在使用MVVM设计UI时,目标是将View的关注点与ViewModel的关注点分开。理想情况下,ViewModel不应该依赖任何视图组件。但是,这是偶像,MVVM的另一个规则是你应该按照自己的意愿设计应用程序。

在提供显示对话框的服务的区域中,有两种不同的方法浮动:

  1. 在视图上实现DialogService(例如,参见http://geekswithblogs.net/lbugnion/archive/2011/04/13/deep-dive-mvvm-samples-mix11-deepdivemvvm.aspx示例03)。
  2. 实施未附加到视图的服务组件(例如,请参阅http://blog.roboblob.com/2010/01/19/modal-dialogs-with-mvvm-and-silverlight-4/
  3. 这两种方法都依赖于定义服务提供的功能的接口。然后将此服务的实现注入ViewModel。

    此外,两种方法都有其特定的优点和缺点。

    • 第一种方法也适用于WP7,但是,它需要一个公共视图基类,因为它包含视图服务的实现。
    • 第二种方法适用于SilverLight和WPF以及appleals,因为它将服务与视图分开,并且不会对视图施加任何限制。

    另一种可能的解决方案是使用消息传递来显示对话框。

    无论您使用何种方法,都尝试通过使用IoC(控制反转)模式来保持View和ViewModel解耦,即定义接口以便您可以使用不同的实现。要将服务绑定到ViewModel中,请使用注入,即将服务传递给ViewModel的构造函数或设置属性。

答案 1 :(得分:7)

我最近开始为我正在创建的WPF应用程序学习MVVM,我使用这个article作为显示对话框的基础,如果你下载示例项目那么它实际上是一个非常好的解耦方法,它很好抽象并获取视图,您传递viewmodel的实例。我为了自己的方式扩展了一些,我还使用了WPFExtendedToolkit MessageBox来发出警告,错误等,因为标准的win32 MessageBox很难看。

关于动态表单,您需要调查ItemsControl,并且在ViewModel中有一个数据项集合,需要由用户编辑以供ItemsControl绑定。我有一个对话框,用于在工作流系统设计器中编辑操作及其参数,其中操作的对话列表是完全动态的。这是通过使用数据类型公开我的项目集合来完成的,这样我就可以使用DataTemplateSelector选择包含正确类型控件的DataTemplates,即DateTime的数据类型显示DatePicker。

希望有助于

答案 2 :(得分:2)

从开发人员进入“维护”通用代码的角度来看,这听起来很痛苦。根据您的描述,我将为表单和对话框提供相同的视图模型,并为要显示的对话框创建特定的XAML模板。