Prism 订阅事件 IEventAggregator 说明
2015-12-19 10:13
357 查看
本节学习了Event Aggregation事件聚合,这个在Prism中很重要,特别是对于Module间的通信。除了前面介绍的Command可以用于模块间的通信,还有我们这一节介绍的Event Aggregation(事件聚合).
(一)为什么不用.NET FrameWork中的事件呢?
使用.NET Framework事件是罪简单和直观的方式用于非松散耦合需求的组件,属于对象引用依赖的发布-订阅模型
(二) EventAggregator事件聚合器
提供了多点传送发布/订阅功能。这意味着可能有可以触发同一事件多个发布者和可以监听同一事件的订阅者。
(三)模块间通信过程简介
CompositePresentationEvent<TPayload>类实例实现了事件的订阅和取消,而IEventAggregator实例用来获取接收CompositePresentationEvent<TPayload>类实例.IEventAggregator实例在每个模块中含有,这样模块间就可以通信了。
(四)下面贴出Prism中Event Aggregation QuickStart的部分代码:
(1)创建了 CompositePresentationEvent<TPayload>类
在项目中EventAggregation.Infrastructure.Silverlight的FundAddedEvent.cs代码中,
View Code
(1)获取事件聚合器实例
(2)调用Subscribe方法
Subscribe方法重载,有不同的作用
Action<T>: 泛型委托
ThreadOption:
当为PublisherThread时(默认值)能获取发布者线程
BackgroundThread时 从.NET Framework线程池上异步获取事件
UIThread时 获取事件从UI线程上。
keepSubscriberReferenceAlive: 当为true 事件实例是强引用订阅者,因此不能垃圾回收
当为false(默认值)弱引用订阅者,因此当没有其他引用时允许垃圾回收释放订阅者实例,当订阅者实例被回收,事件自动取消订阅
(一)为什么不用.NET FrameWork中的事件呢?
使用.NET Framework事件是罪简单和直观的方式用于非松散耦合需求的组件,属于对象引用依赖的发布-订阅模型
(二) EventAggregator事件聚合器
提供了多点传送发布/订阅功能。这意味着可能有可以触发同一事件多个发布者和可以监听同一事件的订阅者。
(三)模块间通信过程简介
CompositePresentationEvent<TPayload>类实例实现了事件的订阅和取消,而IEventAggregator实例用来获取接收CompositePresentationEvent<TPayload>类实例.IEventAggregator实例在每个模块中含有,这样模块间就可以通信了。
(四)下面贴出Prism中Event Aggregation QuickStart的部分代码:
(1)创建了 CompositePresentationEvent<TPayload>类
在项目中EventAggregation.Infrastructure.Silverlight的FundAddedEvent.cs代码中,
public class ActivityPresenter { private string _customerId; private IEventAggregator eventAggregator; private SubscriptionToken subscriptionToken; public ActivityPresenter(IEventAggregator eventAggregator) { this.eventAggregator = eventAggregator; } public void FundAddedEventHandler(FundOrder fundOrder) { Debug.Assert(View != null); View.AddContent(fundOrder.TickerSymbol); } public bool FundOrderFilter(FundOrder fundOrder) { return fundOrder.CustomerId == _customerId; } public IActivityView View { get; set; } public string CustomerId { get { return _customerId; } set { _customerId = value; FundAddedEvent fundAddedEvent = eventAggregator.GetEvent<FundAddedEvent>(); if (subscriptionToken != null) { fundAddedEvent.Unsubscribe(subscriptionToken); } //订阅事件 //(1)获取事件聚合器实例 //(2)调用Subscribe方法 // Subscribe方法重载,有不同的作用 // Action<T>: 泛型委托 // ThreadOption:当为PublisherThread时(默认值)能获取发布者线程 // BackgroundThread时 从.NET Framework线程池上异步获取事件 // UIThread时 获取事件从UI线程上。 // keepSubscriberReferenceAlive: 当为true 事件实例是强引用订阅者,因此不能垃圾回收 // 当为false(默认值)弱引用订阅者,因此当没有其他引用时允许垃圾回收释放订阅者实例,当订阅者实例被回收,事件自动取消订阅 subscriptionToken = fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, false, FundOrderFilter); //lamda表达式写法 //subscriptionToken = fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, false, FunOrder => FunOrder.CustomerId == this._customerId); View.SetTitle(string.Format(CultureInfo.CurrentCulture, Resources.ActivityTitle, CustomerId)); } } }
View Code
(1)获取事件聚合器实例
(2)调用Subscribe方法
Subscribe方法重载,有不同的作用
Action<T>: 泛型委托
ThreadOption:
当为PublisherThread时(默认值)能获取发布者线程
BackgroundThread时 从.NET Framework线程池上异步获取事件
UIThread时 获取事件从UI线程上。
keepSubscriberReferenceAlive: 当为true 事件实例是强引用订阅者,因此不能垃圾回收
当为false(默认值)弱引用订阅者,因此当没有其他引用时允许垃圾回收释放订阅者实例,当订阅者实例被回收,事件自动取消订阅
相关文章推荐
- show full process 查询状态
- 验证插件
- 我们为什么应该坚持写博客
- 【Linux】利用C语言文件流复制单一文件
- iis上json解析失败404
- PHP MySQLi的使用
- 理解LSTM网络(翻译)
- 黑马程序员--java中File操作的一点小问题
- Android之异步加载网络图片
- C语言逗号运算符和逗号表达式
- Memcached 基础理论
- Hadoop2.x配置即测试
- 简单讲解iOS应用开发中的MD5加密的相关使用
- Android开发环境的搭建之(五)DDMS的测试
- 使用git status快速commit
- Linux patch命令参数及用法详解---Linux打补丁命令
- 大数据时代:正在到来的数据革命
- imageView属性之scaleType
- printf那点事
- 使用git status快速commit