Prism的事件并没有直接使用C#的Event或WPF的RoutedEvent, 而是CompositeWpfEvent, 今天简单地谈一谈
1, 为什么是全新打造的CompositeWpfEvent,而非C#的Event或WPF的RoutedEvent?
原因一个: 断开事件发布者和事件订阅者之间的耦合.比如说模块A要订阅模块B的某一个时间,而模块A没有对模块B进行直接引用而是通用依赖注入等方式进行沟通的,所以在编译时无法进行事件的订阅.
而对事件的发布和注册则是通过EventAggregator来统一管理的,其是订阅者和订阅者之间的桥梁,关于EventAggregator,稍后会谈到
不过值得一提的是,CompositeWpfEvent更多地专注在模块之间的事件沟通,他并不是用来取代c#的Event和WPF的RoutedEvent的,他们在处于不同的层面上.
2, EventAggregator
Prism采用了一个称为EventAggregator的聚合器来统一管理事件(CompositeWpfEvent).
这实际上也是一种较常用的模式, 其思想比较简单,提供所有事件的实例:
/// <summary> /// 定义一个接口,其用于获取事件类型的实例 /// </summary> public interface IEventAggregator { /// <summary> /// 获取事件类型的一个实例 /// </summary> /// <typeparam name="TEventType">要获取实例的事件类型</typeparam> /// <returns>事件类型<typeparamref name="TEventType"/>的一个实例.</returns> [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter")] TEventType GetEvent<TEventType>() where TEventType : EventBase; }
所有的事件发布者和订阅者都从EventAggregator从去获取事件来进行发布和订阅, 发布者不关心订阅者是谁,
订阅者也不关心发布者时谁,同一事件可以有着不同的发布者,同一事件也可以有多个订阅者,这形成了多对多的关系.
但可能有人会问, 当我需要指定事件的发布者是谁时该怎么办呢, 就像普通事件中的Sender参数?
很简单, 事件可以传递任意类型的TPlayload参数(相当于XXXEventArgs)
关于EventAggregator模式,你可以参考这里http://martinfowler.com/eaaDev/EventAggregator.html
在Prism中,EventAggregator作为一个基础服务添加到一容器中
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索实例
, 模块
, 事件
, 实例wpf
, RoutedEvent
, 一个
, 订阅事件
, 订阅者
发布者
guidance for、wpf application、wpf application类、wpfapplication1、wpf application介绍,以便于您获取更多的相关知识。