创建MVVM友好对话策略

mor*_*are 22 c# wpf mvvm mvvm-light

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

我正在使用MVVM Light,而且我对这个Messenger课程还很陌生.

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

我想要UserControl打开它是"通用的",我可以抛出任何(可能是一个ViewModel)...它通过a渲染ViewModel DataTemplate并处理所有对象的更改.单击"确定"将回调到发送类并像以前一样保留更改.

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

  1. 显示没有必需用户输入的错误消息(除了可以关闭它)
  2. 显示数据项的编辑表单
  3. 确认对话框(很像标准的MessageBox)

任何人都可以提供我如何实现这一点的代码示例吗?

Axe*_*ger 21

在使用MVVM设计UI时,目标是将View的关注点与ViewModel的关注点分开.理想情况下,ViewModel不应该依赖任何视图组件.但是,这是idal和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/)

这两种方法都依赖于定义服务提供的功能的接口.然后将此服务的实现注入ViewModel.

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

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

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

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


Pau*_*lie 7

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

至于动力形式,那么你就需要调查的ItemsControl,并在您的ViewModels有需要由用户为ItemsControl的结合被编辑的数据项的集合.我有一个对话框,用于在工作流系统设计器中编辑操作及其参数,其中操作的对话列表是完全动态的.这是通过使用数据类型公开我的项目集合来完成的,因此我可以使用DataTemplateSelector选择包含正确类型控件的DataTemplates,即DateTime的数据类型显示DatePicker.

希望有所帮助