为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
蛊毒传说 2023-04-29 15:33:34
我有一个主视图包含多个子视图的应用程序。这些视图有一个相应的 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 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

使用 的教科书示例EventAggregator,但我应该补充一点,子视图模型也是先查看模型的教科书示例。ViewModelLocator对于独立的顶级视图最有用...

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

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

别的地方:

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


查看完整回答
反对 回复 2023-04-29
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信