C# 创建MVVM友好的对话策略

C# 创建MVVM友好的对话策略,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,我正在尝试创建一个策略来处理弹出式表单,以便在我的应用程序的任何部分使用。到目前为止,我的理解是在主窗口的根目录中需要一个UserControl。这将绑定到其自己的ViewModel,该ViewModel将处理应用程序中发送的消息 我使用的是MVVM Light,而且我对Messenger类相当陌生 想象一个主/详细场景,其中一个列表a对象包含在一个列表框中。选择其中一项并单击编辑按钮将显示覆盖整个屏幕的UserControl。然后,用户可以编辑所选项目,并单击“确定”提交更改 我希望打开的Us

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

我使用的是MVVM Light,而且我对
Messenger
类相当陌生

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

我希望打开的
UserControl
是“通用”的,这样我就可以抛出任何一个(可能是一个视图模型)了。。。它可以通过
数据模板
渲染ViewModel,并处理所有对象更改。单击OK将回调发送类,并像以前一样保留更改

在某些情况下,这将是有用的是

  • 显示无需用户输入的错误消息(确定关闭错误消息除外)
  • 显示数据项的编辑表单
  • 确认对话框(很像标准的MessageBox)

  • 有人能提供我如何实现这一点的任何代码示例吗?

    我最近开始为我正在创建的WPF应用学习MVVM,我使用它作为显示对话框的基础,如果您下载示例项目,那么它实际上是一个非常好的解耦方法,它很好地抽象了,要获得视图,您需要传递一个viewmodel实例。为了我自己的方式,我对它进行了一些扩展,我还使用了WPFExtendedToolkit MessageBox来处理警告、错误等,因为标准的win32 MessageBox非常有用

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


    希望这有助于

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

    使用MVVM设计UI时,目标是将视图关注点与视图模型关注点分开。理想情况下,ViewModel不应依赖于任何视图组件。然而,这是IDA,MVVM的另一条规则是,您应该按照自己的意愿设计应用程序

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

  • 在视图上实现DialogService(例如,请参见示例03)
  • 实现未附加到视图的服务组件(例如,请参阅)
  • 这两种方法都依赖于定义服务提供的功能的接口。然后将此服务的实现注入到ViewModel中

    此外,这两种方法是否都有各自的优缺点

    • 第一种方法也适用于WP7,但是,它需要一个公共视图基类,因为它包含视图服务的实现
    • 第二种方法适用于SilverLight、WPF和appleals,因为它将服务与视图分开,并且不会对视图施加任何限制
    另一种可能的解决方案是使用消息传递来显示对话框

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