簡體   English   中英

如何在子視圖的ViewModel中引發ViewModel中的事件

[英]How to raise an event in a ViewModel from within a subview's 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之外的其他東西?

最有效的方法是什么?

使用EventAggregator教科書示例,盡管我應該補充一點,子視圖模型也是先進行視圖模型的教科書示例。 ViewModelLocator對於獨立的頂層ViewModelLocator最有用。

話雖這么說,在子視圖模型中:

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

別的地方:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM