如何从子视图的 ViewModel 中引发 ViewModel 中的事件
How to raise an event in a ViewModel from within a subview's ViewModel
我有一个主视图包含多个子视图的应用程序。这些视图有一个相应的 ViewModel,显示模型中包含的一些数据和监控事件。
假设主视图如下所示:
<UserControl x:Class="MyView" Name="myView">
<StackPanel>
<local:MySubView Name="mySubView" someProperty="{Binding DataContext.someField, ElementName=myView}"/>
[...]
</StackPanel>
</UserControl>
子视图如下所示:
<UserControl x:Class="MySubView"
prism:ViewModelLocator.AutoWireViewModel="True">
[...]
</UserControl>
然后在 MySubViewModel.cs 中,发生了一些事件并调用了一个函数,参数为:
public Event EventHandler<SomeClass> MySubViewEvent;
[...]
void foo() {
SomeClass o = new SomeClass(...);
MySubViewEvent.Invoke(this, o);
}
现在,在 MyViewModel.cs 中,我没有对子视图的直接引用,因此不能说
subViewModel.MySubViewEvent += OnSubViewEvent;
void OnSubViewEvent(object sender, SomeClass param) { ... }
我可以将一些 属性 添加到 MySubViewModel 并使其依赖于 MyViewModel 中的某些字段并具有依赖性 属性,但是 1. 我怎样才能反过来做,以便一些回调或事件处理程序将在 MyViewModel 中引发事件时在 MyViewModel 中调用,以及 2. 我可以以某种方式将事件处理程序作为依赖属性传递吗?
或者我应该为此使用 DependencyProperties 以外的东西吗?
实现此目标最有效的方法是什么?
使用 EventAggregator
的教科书示例,但我应该补充一点,子视图模型也是用于查看 model-first 的教科书示例。 ViewModelLocator
对于独立 top-level 视图最有用...
也就是说,在子视图模型中:
_eventAggregator.GetEvent<MySubViewEvent>().Publish();
其他地方:
public MainViewModel( IEventAggregator eventAggregator )
{
eventAggregator.GetEvent<MySubViewEvent>().Subscribe( OnSubViewEvent );
}
我有一个主视图包含多个子视图的应用程序。这些视图有一个相应的 ViewModel,显示模型中包含的一些数据和监控事件。
假设主视图如下所示:
<UserControl x:Class="MyView" Name="myView">
<StackPanel>
<local:MySubView Name="mySubView" someProperty="{Binding DataContext.someField, ElementName=myView}"/>
[...]
</StackPanel>
</UserControl>
子视图如下所示:
<UserControl x:Class="MySubView"
prism:ViewModelLocator.AutoWireViewModel="True">
[...]
</UserControl>
然后在 MySubViewModel.cs 中,发生了一些事件并调用了一个函数,参数为:
public Event EventHandler<SomeClass> MySubViewEvent;
[...]
void foo() {
SomeClass o = new SomeClass(...);
MySubViewEvent.Invoke(this, o);
}
现在,在 MyViewModel.cs 中,我没有对子视图的直接引用,因此不能说
subViewModel.MySubViewEvent += OnSubViewEvent;
void OnSubViewEvent(object sender, SomeClass param) { ... }
我可以将一些 属性 添加到 MySubViewModel 并使其依赖于 MyViewModel 中的某些字段并具有依赖性 属性,但是 1. 我怎样才能反过来做,以便一些回调或事件处理程序将在 MyViewModel 中引发事件时在 MyViewModel 中调用,以及 2. 我可以以某种方式将事件处理程序作为依赖属性传递吗?
或者我应该为此使用 DependencyProperties 以外的东西吗?
实现此目标最有效的方法是什么?
使用 EventAggregator
的教科书示例,但我应该补充一点,子视图模型也是用于查看 model-first 的教科书示例。 ViewModelLocator
对于独立 top-level 视图最有用...
也就是说,在子视图模型中:
_eventAggregator.GetEvent<MySubViewEvent>().Publish();
其他地方:
public MainViewModel( IEventAggregator eventAggregator )
{
eventAggregator.GetEvent<MySubViewEvent>().Subscribe( OnSubViewEvent );
}