wpf - 如何解决 MVVM 范式中的以下设计? (新)

标签 wpf mvvm prism

我仍然从 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/

相关文章:

wpf - MSBuild 在 C# WPF 应用程序项目上失败

wpf - 如何使用 DelegateCommand 将信息从 View 传递到 ViewModel?

c# - 如何从应用程序中启动一个新的应用程序实例?

wpf - 如何使用 Caliburn.Micro 将多个 ViewModel 绑定(bind)到 Expander 中?

c# - 如何在 Prism 5.0 中为 TreeviewItem 编写 EventToCommand

在另一台计算机上使用时,具有本地数据库的 C# WPF 应用程序崩溃

c# - 绑定(bind)到 ObservableCollection 中的项目字段的总数,并在值更改时更新

c# - WPF Datepicker 使用 MVVM 返回先前选择的日期

silverlight - 如何激活属于同一区域的多个 View ?

c# - 如何使用Prism的viewlocator将多个ViewModel连接到单个View?