如何从子视图的 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 );
}