是的,您正在以正确的方式考虑这一点。EventAggregator 是您正在做的事情的好工具。您需要在计划从中引发事件的每个窗口上都有 EventAggregator。您可以将 EA 注入您的构造函数或使用 ServiceLocator。这里有 2 个例子:
// Ctor injection
private IEventAggregator _eventAggregator;
public ViewModelBase(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
// Service Locator
ServiceLocator.Current.GetInstance<IEventAggregator>().GetEvent<YourEvent>().Publish();
现在,您需要创建一个 CompositePresentationEvent 供 EA 发布。您可以通过在 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);