当前位置:  开发笔记 > 运维 > 正文

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

如何解决《WPF中松散耦合的事件,不使用Prism》经验,为你挑选了1个好方法。

我正在使用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分离并支持多个订阅者的命令.



1> Glenn Block..:

你有一个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也有一个帖子.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有