我正在尝试创建一个处理弹出窗体的策略,以便在我的应用程序的任何部分使用。到目前为止,我的理解是我需要在MainWindow的根目录中使用一个UserControl
。这将绑定到自己的ViewModel,它将处理在应用程序中发送的消息。
我正在使用MVVM Light,而且我对Messenger
类很新。
想象一下Master / Details场景,其中一个对象列表包含在ListBox
中。选择其中一个项目并单击“编辑”按钮将显示覆盖整个屏幕的UserControl
。然后,用户可以编辑所选项目,然后单击“确定”以提交更改。
我希望打开的UserControl
是“通用的”,我可以在其中抛出任何(可能是ViewModel)......它通过DataTemplate
呈现ViewModel并处理所有对象更改。单击“确定”将回调发送类并像以前一样保留更改。
某些有用的情况是......
任何人都可以提供我如何实现这一目标的代码示例吗?
答案 0 :(得分:21)
在使用MVVM设计UI时,目标是将View的关注点与ViewModel的关注点分开。理想情况下,ViewModel不应该依赖任何视图组件。但是,这是偶像,MVVM的另一个规则是你应该按照自己的意愿设计应用程序。
在提供显示对话框的服务的区域中,有两种不同的方法浮动:
这两种方法都依赖于定义服务提供的功能的接口。然后将此服务的实现注入ViewModel。
此外,两种方法都有其特定的优点和缺点。
另一种可能的解决方案是使用消息传递来显示对话框。
无论您使用何种方法,都尝试通过使用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模板。