当前位置: 欣欣网 > 码农

C# WPF MVVM模式Caliburn.Micro框架下事件发布与订阅

2024-02-07码农

01

前言

处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Caliburn提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯,且彼此之间没有引用,这就实现了模块之间低耦合的通信方式。 简单来说就是提供了一个多播发布/订阅功能。 Caliburn的事件聚合器,这玩意实现原理是观察者模式,观察者模式也就是常说的发布/订阅模式。

02


创建事件

这里我们创建一个公共接口类 PersonInfoEven 并继承自PubSubEvent,并传入一个 PersonInfo 对象

public classPersonInfo {publicstring Name { get; set; }publicint Age { get; set; }publicstring Sex { get; set; }publicoverridestringToString() {string report = $"[Name] = [{Name}],[Age] = [{Age}],[Sex] = [{Sex}]";return report; } }public classPersonInfoEven : PersonInfo { }

03


订阅事件

IEventAggregator eventAggregator;定义事件聚合器

然后通过ioc获取事件聚合器实例

this.eventAggregator = IoC.Get<IEventAggregator>();

注意需要继承接口IHandle<PersonInfoEven>

classStartViewModel : Caliburn.Micro.Screen, IShell,IHandle<PersonInfoEven>

然后订阅

this.eventAggregator.Subscribe(this);

publicvoidHandle(PersonInfoEven message) { System.Windows.MessageBox.Show(message.ToString()); }

04


发布事件

可以选择同步发布或者异步发布:

IEventAggregator eventAggregator;publicvoid EventTest() {this.eventAggregator = IoC.Get<IEventAggregator>();//方法1 同步ui发布事件//this.eventAggregator.PublishOnUIThread(new PersonInfoEven() { Name = "ZYR",Age=18,Sex ="man"});//方法2 开线程去发布this.eventAggregator.Publish(new PersonInfoEven() { Name = "ZYR", Age = 18, Sex = "man" }, action => {//方式①//Task.Factory.StartNew(action);//方式② Task.Run(action); }); }

这样,一个发布/订阅的事件就完成了,也可以在任何时候取消事件注册,只需要调用Unsubscribe方法即可

由于它是多播的,你可以在任意多个地方进行发布或订阅。

05


效果演示

06


技术群: 添加小编微信并备注进群

小编微信:mm1552923

公众号:dotNet编程大全

07


经典回顾

因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下「赞」和「在看」,这样每次新文章推送才会第一时间出现在你的订阅列表里。点击「赞」和「在看」支持我们吧!


往期推荐