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框架Caliburn.Micro入门实例1

C# WPF MVVM项目实战(进阶①)

C# WPF MVVM项目实战(进阶②)

C# WPF框架Caliburn.Micro快速搭建

C# WPF项目实战

C# WPF mvvm模式下combobox绑定(list<enum>、Dictionary<int,string>)

C# WPF MVVM模式下在主窗体显示子窗体并获取结果

C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面

C# WPF文本框TextEdit不以科学计数法显示

C# 通过正则表达式来限制控件输入有效性

C# datagridview、datagrid、GridControl增加行号

C# =>符号的使用

C# 无意间写了一段线程死锁的代码

C# 看懂这100+行代码,你就真正入门了(经典)

C# WPF项目实战(经典)

WPF 如何修改button圆角(经典)

WPF XAML 为项目设置全局样

 

posted @   zls366  阅读(610)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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的设计差异
点击右上角即可分享
微信分享提示