WPF中松散耦合的事件,不使用Prism

时间:2008-10-22 04:58:18

标签: .net wpf design-patterns mvvm

我正在使用WPF应用程序并使用Model-View-ViewModel模式。

该应用程序目前包含两个模块:

  • 左侧面板以浏览树并选择节点
  • 主面板显示所选树节点的内容。

我想将这两个模块分开,但是当我在左侧面板中选择一个节点时,我需要触发主面板可以订阅的事件。我不想结合Left和Main面板,所以我不想共享ViewModel类的实例。

最好我希望使用Prism(WPF复合应用程序指南),但我目前正在扩展现有的应用程序,并且不能引入更多的依赖项。该项目也在.NET 3.0(而非3.5)上,因此我必须将Prism转换回.NET 3.0,因为它是为.NET 3.5编写的。

在Prism中,我会使用Loosely Coupled事件基础设施来解决这个问题。它允许您在任何层中的任何类中触发事件,并侦听任何层中任何类中的任何事件。基本上,事件的发布者和订阅者是分离的。

我使用命令在我的View和ViewModel之间实现这种松散耦合,但我不确定如何进行正确的跨视图通信。

非常感谢任何提示或建议。

我专门为.NET 2.0 / 3.0(没有LINQ的东西)寻找一个真正的轻量级发布/子事件模型,或者实现跨视图的其他东西(模块) )没有耦合两个模块的通信。

更新:我最终以与Glen建议类似的方式解决了这个问题。我有一个单独的EventService(我称之为CommandProxy),并通过我的服务定位器中的构造函数将其传递给每个ViewModel(目前我正在使用服务定位器而不是IoC容器)。 CommandProxy公开了一组MultiDelegateCommants,它是Prism中的DelegateCommand(复合WPF指南)的扩展。它基本上允许与Visual Tree分离的命令,并支持多个订阅者。

1 个答案:

答案 0 :(得分:7)

你有一个IoC容器吗?一种简单的方法是创建一个触发事件的自定义服务。 Event Aggregator是通用的,但您可以创建一个能够满足您需求的特定服务。

例如,创建一个具有OnNodeSelected方法的EventingService。该方法触发一个挂起服务的NodeSelected事件。然后,该服务在您的IoC容器中注册,允许发布者和订阅者访问它。这样,如果你的MainPanel需要订阅,那么你的MainPanelViewModel将在它的构造函数中注入EventingServiec。然后它会订阅。如果您使用WPF,另一种方法是从Composite App Library代码中提取CompositeCommand,并让事件服务公开CompositeCommand。然后,每个订户(View Model)向服务注册其命令。调用OnNodeSelected时,将调用CompositeCommand的execute,从而通知所有感兴趣的各方。

我们在www.microsoft.com/compositewpf的“通信中松散耦合事件”一节中的复合应用指南文档中讨论了如何使用自己的服务。 (http://msdn.microsoft.com/en-us/library/cc707836.aspx)。 Francis Cheung也有一个帖子。