0

我仍然从 MVVM 开始,并阅读了所有 MSDN Prism 示例,但我仍然想要一些关于以下设计问题的指导,我认为这将帮助我抓住 Prism 概念并加强我刚刚学到的东西

我有一个多窗口应用程序 - 每个窗口都有一个过滤器下拉控件。此过滤器控件的值将影响同一窗口内其他控件的显示,例如网格、图表等。

某些交互(例如,双击网格上的一行)将生成另一个窗口,该窗口将具有自己的单独过滤器控件,这将类似地影响仅在该窗口中的其他控件的显示

如何实现过滤器的这种行为来驱动它不知道的其他用户控件的显示,并将其行为限制为仅托管它的窗口?如何保持这些交互松散耦合?

我在想我需要使用 EventAggregator 并让过滤器控件在选择更改时发布更新事件?我是否以正确的方式思考这个问题?每个窗口都需要一个单独的 EventAggregator 吗?

4

3 回答 3

2

您应该使用 发布过滤器通知EventAggregator,根据我的经验,这是最好的方法。您应该只使用一个EventAggregator作为所有订阅对象之间的集线器。

就像是:

MyNotificationChangedArgs args = new MyNotificationChangedArgs();
args.Payload = GetThePayload(someParameters);
myEventAggregator.GetEvent<NotificationFilterChangedEvent>().Publish(args);

另一件真正有帮助的事情是依赖注入EventAggregator,例如通过Unity. 这样,您的所有控件都可以EventAggregator通过调用UnityContainer.Resolve方法简单地访问公共:

var myEventAggregator = myUnityContainer.Resolve<MyEventAggregator>();
于 2012-11-02T16:10:05.230 回答
2

是的,您正在以正确的方式考虑这一点。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);
于 2012-11-02T17:25:37.617 回答
1

每个 View 都可以通过 ViewModel 访问 Model。为您的过滤器建模。然后视图绑定到使用过滤器的 ViewModel 表示。您的视图不必相互了解,它们只需绑定到模型。

于 2012-11-02T16:03:59.433 回答