是的,你想這個正確的方式。 EventAggregator是你正在做的事情的好工具。您需要在每個計劃從中引發事件的窗口上都有EventAggregator。您可以將EA注入您的構造函數或使用ServiceLocator。以下是兩個示例:
// Ctor injection
private IEventAggregator _eventAggregator;
public ViewModelBase(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
// Service Locator
ServiceLocator.Current.GetInstance<IEventAggregator>().GetEvent<YourEvent>().Publish();
現在,您需要爲EA創建一個CompositePresentationEvent來發布。您可以最大限度地減少通過在CPE中包含有效負載而創建的這些數量。事情是這樣的:
public class NavigationSelectedEvent : CompositePresentationEvent<NavigationEnum.Destination>{}
所以,現在你已經準備好發佈事件:
_eventAggregator.GetEvent<NavigationSelectedEvent>().Publish(NavigationEnum.Destination.Home);
然後訂閱它 - 有效載荷使用可選的過濾器,使你不浪費資源:
this.EventAggregator.GetEvent<NavigationSelectedEvent>().Subscribe(HandleNavigationEvent, ThreadOption.UIThread, false, i => i == NavigationEnum.Destination.Home);
好啊 - 這是我期待的有效載荷上的過濾器! 非常感謝您的指導,這實際上就是我心中的想法,很高興看到我處於正確的軌道上! :) – blue18hutthutt
我有一個問題 - 我將如何設置當前ViewModel是MVVM導向方式的一部分?我有這樣的印象:虛擬機不知道綁定它們的視圖(以及窗口),因此如何告訴我的控件的虛擬機他們是哪個窗口的一部分? – blue18hutthutt
@ blue18hutthutt ...你是對的,虛擬機不應該瞭解這些觀點。您需要在views/xaml中使用create Regions並使用RegionManager加載它們。 –