MVVM 方式通知邻居用户控件更改

MVVM-way to notify neighbour usercontrol about changes

所有!

在我的主 window 中,我有一个包含 2 列的网格。第 0 列是带有设置的用户控件,第 1 列是带有内容的用户控件。 目标是在更改设置时用内容重置用户控件。正确的“MVVM”方式是什么?

两个用户控件都以 MVVM 方式实现,所有业务逻辑都在 ViewModel 中。

假设我有一个 CheckBox 绑定到 settings-usercontrol 中的 属性:

Settings.xaml

...
<CheckBox IsChecked="{Binding Path=MySettingNr1}">
...

Settings_ViewModel.cs

...
public bool MySettingNr1 
{
  get 
  {
    return _model.SttNr1;
  }
  set 
  {
    if(_model.SttNr1 == value) return;
    _model.SttNr1 = value;
    OnPropertyChanged(nameof(MySettingNr1));
  }
}
...

如果用户单击此复选框,我如何通知我的内容用户控件?
路由事件可能不会执行,因为两个用户控件都是 neighbors 在主 window 网格中。
我想到的唯一方法是使用设置在用户控件中触发一个事件,在 main windows 中捕获它并使用内容调用用户控件的函数。有没有办法让这个调用链更短?

提前致谢。

您可以为两个用户控件绑定到的 window 使用单个共享视图模型,即它们都继承父 window 的 DataContext。这样他们就可以直接通过共享视图模型进行通信。

如果您希望有两个不同的视图模型,每个用户控件一个,您可以使用事件聚合器或信使以松散耦合的方式将 event/message 从一个视图模型发送到另一个视图模型。

大多数 MVVM 库都为此实现了解决方案。例如,Prism 使用 event aggregator and MvvmLight uses a messenger

更多概念请参考this blog post