我正在开发一个 WPF 应用程序,并且正在使用 Model-View-ViewModel 模式。
该应用程序目前由两个模块组成:
- 左面板浏览树并选择一个节点
- 主面板显示所选树节点的内容。
我想将这两个模块分开,但是当我在左侧面板中选择一个节点时,我需要触发一个主面板可以订阅的事件。我不想耦合左面板和主面板,所以我不想共享 ViewModel 类的实例。
理想情况下,我很想使用 Prism(WPF 复合应用程序指南),但我目前正在扩展现有应用程序,无法引入更多依赖项。该项目也在 .NET 3.0(不是 3.5)上,所以我必须将 Prism 转换回 .NET 3.0,因为它是为 .NET 3.5 编写的。
在 Prism 中,我会使用松耦合事件基础设施来解决这个问题。它允许您在任何层中的任何类中触发事件,并在任何层中的任何类中侦听任何事件。基本上,事件的发布者和订阅者是分离的。
我使用命令来实现我的视图和我的视图模型之间的这种松散耦合,但我不确定如何进行正确的跨视图通信。
非常感谢任何提示或建议。
我正在专门为 .NET 2.0/3.0(没有 LINQ 的东西)寻找一个真正轻量级的 pub/sub 事件模型,或者在不耦合两个模块的情况下实现跨视图(模块)通信的其他东西。
更新:我最终以与 Glen 建议的方式类似的方式解决了这个问题。我有一个单独的 EventService(我称之为 CommandProxy),并通过我的服务定位器中的构造函数将它传递给每个 ViewModel(目前我使用的是服务定位器而不是 IoC 容器)。CommandProxy 公开了一组 MultiDelegateCommants,它是 Prism(复合 WPF 指导)中 DelegateCommand 的扩展。它基本上允许从可视树中分离出来的命令,并且支持多个订阅者。