我有一个带有主视图的应用程序,其中包含几个子视图。这些视图具有对应的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之外的其他东西吗?
最有效的方法是什么?
答案 0 :(得分:2)
使用EventAggregator
的教科书示例,尽管我应该补充一点,子视图模型也是先进入视图模型的教科书示例。 ViewModelLocator
对独立的顶层视图最有用...
话虽如此,在子视图模型中:
_eventAggregator.GetEvent<MySubViewEvent>().Publish();
其他地方:
public MainViewModel( IEventAggregator eventAggregator )
{
eventAggregator.GetEvent<MySubViewEvent>().Subscribe( OnSubViewEvent );
}