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
所有!
在我的主 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