如何从子视图的 ViewModel 中引发 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 中调用某些回调或事件处理程序在 MySubViewModel 中,以及 2. 我可以以某种方式将事件处理程序作为依赖属性传递吗?


或者我应该为此使用 DependencyProperties 以外的东西吗?


实现这一目标的最有效方法是什么?


蛊毒传说
浏览 119回答 1
1回答

噜噜哒

使用 的教科书示例EventAggregator,但我应该补充一点,子视图模型也是先查看模型的教科书示例。ViewModelLocator对于独立的顶级视图最有用...话虽如此,在子视图模型中:_eventAggregator.GetEvent<MySubViewEvent>().Publish();别的地方:public&nbsp;MainViewModel(&nbsp;IEventAggregator&nbsp;eventAggregator&nbsp;) { &nbsp;&nbsp;&nbsp;&nbsp;eventAggregator.GetEvent<MySubViewEvent>().Subscribe(&nbsp;OnSubViewEvent&nbsp;); }
打开App,查看更多内容
随时随地看视频慕课网APP