创build一个MVVM友好的对话框策略

我正在尝试创build一个处理popup窗体的策略,以供我的应用程序的任何部分使用。 我的理解到目前为止,我将需要在我的主窗口的根单个UserControl 。 这将被绑定到它自己的ViewModel,它将处理在应用程序内发送的消息。

我正在使用MVVM Light,对于Messenger类我还是比较新的。

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

我想打开的UserControl是“通用”的方式,我可以抛出任何(可能是一个ViewModel)…它通过DataTemplate呈现ViewModel并处理所有对象的变化。 点击确定将callback到发送类,并像以前一样坚持更改。

有些情况下,这将是有用的是…

  1. 显示不需要用户input的错误消息(除了确定closures它)
  2. 显示数据项目的编辑表单
  3. 确认对话框(很像标准的MessageBox)

任何人都可以提供任何代码样本,我怎么可能实现这个?

使用MVVMdevise用户界面时,目标是将View的关注点与ViewModel的关注点分开。 理想情况下,ViewModel不应该依赖任何视图组件。 但是,这是idal,MVVM的另一个规则是,你应该devise你的应用程序,如你所愿。

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

  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/

两种方法都依赖于定义服务提供的function的接口。 然后将该服务的实现注入到ViewModel中。

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

  • 第一种方法也适用于WP7,然而,它需要一个通用的视图基类,因为这包含视图服务的实现。
  • 第二种方法适用于SilverLight,WPF和Apple,因为它使服务与视图分离,并且不会对视图进行任何重新定位。

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

无论您使用什么方法,都可以通过使用IoC(反转控制)模式来保持View和ViewModel的分离,即定义一个接口,以便使用不同的实现。 将服务绑定到ViewModel使用注入,即将服务传递给ViewModel的构造函数或设置属性。

我最近开始学习MVVM为我正在创build的WPF应用程序,我用这篇文章作为显示对话框的基础,如果你下载示例项目,那么它实际上是一个很好的解耦方法,它是很好的抽象,并得到一个视图传递一个视图模型的实例。 我扩展它有点为我自己的手段,我也使用WPFExtendedToolkit MessageBox的警告,错误等,因为标准的Win32 MessageBox很难受。

关于dynamic表单,那么你会想调查ItemsControl,并在你的ViewModels有一个数据项集合,需要由用户编辑的ItemsControl绑定到。 我有一个对话框,用于在工作stream系统devise器中编辑动作及其参数,其中动作的对话列表完全是dynamic的。 这是通过公开我的项目与他们的数据types的集合,以便我可以然后使用DataTemplateSelector来selectDataTemplates包含正确的控件types,即数据types的DateTime显示DatePicker。

希望帮助

从开发人员维护通用代码的angular度来看,这听起来像是一种痛苦。 从你所描述的,我会给窗体和对话框相同的视图模型,并创build一个特定的XAML模板为您要显示的对话框。