C# WPF MVVM模式Prism框架下事件发布与订阅
01
—
前言
处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯,且彼此之间没有引用,这就实现了模块之间低耦合的通信方式。简单来说就是提供了一个多播发布/订阅功能。Prism的事件聚合器,这玩意实现原理是观察者模式,观察者模式也就是常说的发布/订阅模式。
02
—
创建事件
这里我们创建一个公共接口类PersonInfoEven并继承自PubSubEvent,并传入一个PersonInfo对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class PersonInfo { public string Name { get ; set ; } public int Age { get ; set ; } public string Sex { get ; set ; } public override string ToString() { string report = $ "[Name] = [{Name}],[Age] = [{Age}],[Sex] = [{Sex}]" ; return report; } } public class PersonInfoEven : PubSubEvent<PersonInfo> { } |
03
—
订阅事件
IEventAggregator eventAggregator;定义事件聚合器
然后获取事件聚合器实例
1 | this .eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>(); |
并通过IEventAggregator的GetEvent获取定义的消息,再通过Subscribe方法注册,Subscribe是一个委托方法
1 | eventAggregator.GetEvent<PersonInfoEven>().Subscribe(ShowNews); |
1 2 3 4 | private void ShowNews(PersonInfo obj) { TxtLabel = $ "{obj.ToString()}" ; } |
04
—
发布事件
1 2 3 4 5 6 7 8 9 | //创建一个命令,当执行该命令时执行发布事件的逻辑 PubSubEventCommand = new DelegateCommand(PubSubEventMessage); //发布事件方法 private void PubSubEventMessage() { eventAggregator.GetEvent<PersonInfoEven>().Publish( new PersonInfo() {Name = "zyr" ,Age = 18,Sex = "nan" }); } |
这样,一个发布/订阅的事件就完成了,也可以在任何时候取消事件注册,只需要调用Unsubscribe方法即可
1 | eventAggregator.GetEvent<PersonInfoEven>().Unsubscribe(ShowNews); //解除订阅 |
由于它是多播的,你可以在任意多个地方进行发布或订阅。
05
—
效果演示
06
—
源码
链接:https://pan.baidu.com/s/1H3HtTRAZVS-FlReTe00yxQ
提取码:添加小编微信zls20210502获取
技术群: 需要进技术群的添加小编微信zls20210502 ,备注:加群;
07
—
经典回顾
往期推荐
C# WPF mvvm模式下combobox绑定(list<enum>、Dictionary<int,string>)
C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面
C# datagridview、datagrid、GridControl增加行号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异