组合WPF视图和MVVM视图模型

本文关键字:视图 模型 MVVM 组合 WPF | 更新日期: 2023-09-27 18:19:53

我有一个带有嵌套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内部的MainWindowViewModelCurrentlySelectedGroup性质。

我的第一直觉是使用事件在父视图模型和子视图模型之间进行通信。我认为绑定最好保持在视图模型和它的视图之间。到目前为止,事件一直用于在ViewModel和Commands之间进行通信。如果有其他可能的方向,那会更好,我很想听听。

组合WPF视图和MVVM视图模型

你试过使用消息总线吗??有几个框架可以实现这种模式:

  • PRISM,有它的EventAggregator,你可以在那里定义一个合同,然后发送和接收通知
  • MVVM Light,还有一个MessageBus,你可以在这里了解它
  • RectiveUI,这是我最喜欢的,它结合了Reactive Extensions Observable和Message Bus模式的功能,一些文档可以在这里找到

使用这种模式,您的ViewModel可以以松散耦合的方式与其他人通信,因为每个ViewModel都只发送一条消息,而不在乎谁将监听它。如果ViewModel想要监听特定的消息类型,它可以订阅以只获取这些消息。