Prism 订阅事件 IEventAggregator 说明
来源:互联网 发布:tensorflow 实际应用 编辑:程序博客网 时间:2024/06/10 00:15
本节学习了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代码中,
//定义CompositePresentationEvent<TPayload>类 //(1)该类是泛型类:强制发布者和订阅者要一种正确的类型实现 发布-订阅连接 //(2)是唯一继承自EventBase的类 //(3)因为CompositePresentationEvent<TPayload>往往被多个模块公用,所以要单独于 // 其他的模块新建类库项目 //FundOrder是这里的TPayLoad类型 public class FundAddedEvent : CompositePresentationEvent<FundOrder> { }
(2)事件的发布
在ModuleA.Silverlight项目中的
public class AddFundPresenter { private IAddFundView _view; //IEventAggregator 事件聚合器接口 private IEventAggregator eventAggregator; public AddFundPresenter(IEventAggregator eventAggregator) { this.eventAggregator = eventAggregator; } //事件发布:当用户添加一个fund基金,事件就被发布 //发布者发布一个事件 //(1)通过IEventAggregator的实例eventAggregator的Publish方法 //(2)指定GetEvent<TEventType>中TEventType为FunAddedEvent void AddFund(object sender, EventArgs e) { FundOrder fundOrder = new FundOrder(); fundOrder.CustomerId = View.Customer; fundOrder.TickerSymbol = View.Fund; if (!string.IsNullOrEmpty(fundOrder.CustomerId) && !string.IsNullOrEmpty(fundOrder.TickerSymbol)) eventAggregator.GetEvent<FundAddedEvent>().Publish(fundOrder); } public IAddFundView View { get { return _view; } set { _view = value; _view.AddFund += AddFund; } } }
(3)事件的订阅
在ModuleB.Silverlight项目中的ActivityPresenter.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)); } } }
(1)获取事件聚合器实例
(2)调用Subscribe方法
Subscribe方法重载,有不同的作用
Action<T>: 泛型委托
ThreadOption:
当为PublisherThread时(默认值)能获取发布者线程
BackgroundThread时 从.NET Framework线程池上异步获取事件
UIThread时 获取事件从UI线程上。
keepSubscriberReferenceAlive: 当为true 事件实例是强引用订阅者,因此不能垃圾回收
当为false(默认值)弱引用订阅者,因此当没有其他引用时允许垃圾回收释放订阅者实例,当订阅者实例被回收,事件自动取消订阅
- Prism 订阅事件 IEventAggregator 说明
- Prism 框架中使用IEventAggregator事件聚合器简单实现ViewModel之间的通讯
- 利用Prism的IEventAggregator事件聚合器来实现ViewModel之间的通讯
- Silverlight - Prism Event Aggregator - 事件订阅与退订
- 以WebBrowser.DocumentCompleted 事件为例,说明用C#如何完成事件的订阅处理。
- .Net 以WebBrowser.DocumentCompleted 事件为例,说明用C#如何完成事件的订阅处理
- 以WebBrowser.DocumentCompleted 事件为例,说明用C#如何完成事件的订阅处理。
- Prism
- prism
- Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
- c# 订阅事件
- 事件订阅之BUG
- 4.8订阅事件
- CSDN RSS客户端订阅说明
- 事件使用情况-侦听事件,订阅事件
- C#、最简单、事件委托、订阅事件、订阅者模式
- C# 事件 之订阅和取消订阅事件
- 一个事件被多次订阅
- P1074 靶状数独(优化)
- linux安装git
- C++动态内存分配
- Vector 是线程安全的?
- Spring MVC @CookieValue注解
- Prism 订阅事件 IEventAggregator 说明
- Android开发的你必须要掌握的热门开源框架
- 欢迎使用CSDN-markdown编辑器
- NYOJ47 过河问题
- 微信开发H5 video 视频在ios可以播放但是在android手机上无法播放或者黑屏
- 18.导航
- Anaconda使用总结
- 日记:slf4j与log4j的问题记录
- leetcode-496-Next Greater Element I