如何在子视图的ViewModel中引发ViewModel中的事件

时间:2019-06-21 14:11:04

标签: c# wpf mvvm prism

我有一个带有主视图的应用程序,其中包含几个子视图。这些视图具有对应的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中的某些回调或事件处理程序被调用时,事件在MySubViewModel中引发,并且2.我可以以某种方式将事件处理程序作为依赖项属性传递吗?

或者我应该使用DependencyProperties之外的其他东西吗?

最有效的方法是什么?

1 个答案:

答案 0 :(得分:2)

使用EventAggregator的教科书示例,尽管我应该补充一点,子视图模型也是先进入视图模型的教科书示例。 ViewModelLocator对独立的顶层视图最有用...

话虽如此,在子视图模型中:

_eventAggregator.GetEvent<MySubViewEvent>().Publish();

其他地方:

public MainViewModel( IEventAggregator eventAggregator )
{
    eventAggregator.GetEvent<MySubViewEvent>().Subscribe( OnSubViewEvent );
}