我有一个带有嵌套WPF用户控件的UI,每个控件都有自己的视图模型。视图(XAML)层次结构的一个简单例子是:
MainWindow
|-> Logical group
|-> Logical control
|-> Second logical group
|-> Third logical group
|-> Logical control
每个XAML视图都有一个ViewModel,它封装了交互逻辑。我的问题是关于将ViewModel状态从父视图模型传递到子视图模型。
例如,MainWindow
中的用户交互可以在MainWindowViewModel
中设置CurrentlySelectedGroup
变量。我需要知道LogicalControlViewModel
内部的值是多少。
我考虑的主要方法有两种。首先,我可以广播一个事件DispatchGroupSelected
,然后在LogicalControlViewModel
中分配一个委托作为该事件的侦听器。其次,我可以将Bind
转化为LogicalControlViewModel
内部的MainWindowViewModel
的CurrentlySelectedGroup
性质。
我的第一直觉是使用事件在父视图模型和子视图模型之间进行通信。我认为绑定最好保持在视图模型和它的视图之间。到目前为止,事件一直用于在ViewModel和Commands之间进行通信。如果有其他可能的方向,那会更好,我很想听听。
你试过使用消息总线吗??有几个框架可以实现这种模式:
- PRISM,有它的EventAggregator,你可以在那里定义一个合同,然后发送和接收通知
- MVVM Light,还有一个MessageBus,你可以在这里了解它
- RectiveUI,这是我最喜欢的,它结合了Reactive Extensions Observable和Message Bus模式的功能,一些文档可以在这里找到
使用这种模式,您的ViewModel可以以松散耦合的方式与其他人通信,因为每个ViewModel都只发送一条消息,而不在乎谁将监听它。如果ViewModel想要监听特定的消息类型,它可以订阅以只获取这些消息。