WPF MVVM框架------ Prism中的事件聚合器(IEventAggregator)
在.net中,事件的订阅和发布使用比较简单,但具有依赖关系。
Prism框架中提供的事件聚合器,可实现多点传送发布/订阅功能,可以用于ViewModel与ViewModel、ViewModel与View以及模块与模块之间的通信。这次主要实现viemodel之间的消息传递,将MainViewModel中的消息传递到RegionFirstViewModel,实现修改RegionFirstView界面上的数字
准备工作
MainView
模仿导航管理页面RegionManageView修改MainView布局,并实现对应的ViewModel中的Comnmand,实现导航功能
MainViewModel
public DelegateCommand<string> OpenViewCommand { get => _openViewCommand ?? new DelegateCommand<string>(DoAboutCommand); } public DelegateCommand ReviseTitleCommand { get => _reviseTitleCommand ?? new DelegateCommand(DoReviseTitleCommand); } private readonly IEventAggregator _eventAggregator; /// <summary> /// 通过构造函数注入事件聚合器eventAggregator /// </summary> /// <param name="regionManager"></param> /// <param name="eventAggregator"></param> public MainViewModel(IRegionManager regionManager, IEventAggregator eventAggregator) { this.regionManager = regionManager; this._eventAggregator = eventAggregator; } private void DoReviseTitleCommand() { Task.Run(() => { for (int i = 0; i < 10; i++) { _eventAggregator.GetEvent<MessageArg>().Publish(i); Thread.Sleep(1000); } }); } private void DoAboutCommand(string obj) { regionManager.Regions["MainContent"].RequestNavigate(obj); }
OpenViewCommand 是实现导航
ReviseTitleCommand 命令是实现消息发布的,在发布消息时,需要拿到消息类型,需要新建一个类,并继承PubSubEvent<TPayload>,该类用于维护订阅者列表,并实现向订阅者发送消息
MessageArg

RegionFirstViewModel
当发布者发布消息时,就会执行订阅者的方法OnSubscribe(),从而达到修改Name的效果,在RegionFirstView界面就可以看到最底下在文本框的数字在变化
事件过滤
在订阅的时候,不同的订阅者可能想要获得的信息不一样,这是后就需要对于传递的消息进行过滤
//ThreadOption 指定在哪个线程上接收委托回调 PublisherThread与发布者在同一线程执行 _eventAggregator.GetEvent<MessageArg>().Subscribe(OnSubscribe, ThreadOption.PublisherThread, false, MessageFilter); private bool MessageFilter(int obj) { return obj % 2 == 0; }
在这里对传过来的数值进行过滤,不符合 obj % 2 == 0 这个条件的数值都会被过滤掉
订阅线程
在默认情况下,订阅者在发布者的线程上接收事件,当我们想要在更新界面上的控件时,就需要在UI线程进行更新,就可以配置为 ThreadOption.UIThread ,这样就可以直接更新控件。
当配置为 ThreadOption.BackgroundThread 时,订阅者会在线程池中接收事件
总结:
1.使用方法
1)通过构造函数注入获取事件聚合器
2)定义一个事件类型通道类MessageArg,继承自PubSubEvent,用于维护订阅者列表并传递发布者消息
3)订阅 _eventAggregator.GetEvent<MessageArg>().Subscribe(OnSubscribe, ThreadOption.PublisherThread, false, MessageFilter);
4)发布_eventAggregator.GetEvent<MessageArg>().Publish(123);
2.注意
及时取消订阅,可以避免太多不必要的订阅而导致性能问题
设置为弱引用时,可被被垃圾回收
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?