我正在使用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东西)寻找一个非常轻量级的pub/sub事件模型,或者在没有耦合两个模块的情况下实现跨视图(模块)通信的其他东西.
更新:我最终以与Glen建议类似的方式解决了这个问题.我有一个单独的EventService(我称之为CommandProxy),并通过我的服务定位器中的构造函数将其传递给每个ViewModel(目前我正在使用服务定位器而不是IoC容器).CommandProxy公开了一组MultiDelegateCommants,它是Prism中的DelegateCommand(复合WPF指南)的扩展.它基本上允许与Visual Tree分离并支持多个订阅者的命令.
你有一个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也有一个帖子.