我仍然从 MVVM 开始,并阅读了所有 MSDN Prism 示例,但我仍然想要一些关于以下设计问题的指导,我认为这将帮助我捕获 Prism 概念并加强我刚刚学到的东西
我有一个多窗口应用程序 - 每个窗口都有一个过滤器下拉控件。此过滤器控件的值将影响同一窗口内其他控件的显示,例如网格、图表等。
某些交互(例如,双击网格上的一行)将产生另一个窗口,该窗口将具有自己的单独过滤器控件,这将类似地影响仅在该窗口中的其他控件的显示
如何实现过滤器的这种行为来驱动它不知道的其他用户控件的显示,并将其行为限制为仅托管它的窗口?如何保持这些交互松散耦合?
我在想我需要使用 EventAggregator 并让过滤器控件在选择更改时发布更新事件?我是否以正确的方式思考这个问题?每个窗口都需要一个单独的 EventAggregator 吗?
最佳答案
是的,您正在以正确的方式考虑这一点。 EventAggregator 是您正在做的事情的好工具。您需要在计划从中引发事件的每个窗口上都有 EventAggregator。您可以将 EA 注入(inject)您的构造函数或使用 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);
关于wpf - 如何解决 MVVM 范式中的以下设计? (新),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198654/