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

01

前言

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

02


创建事件

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

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 : PersonInfo{}

03


订阅事件

  IEventAggregator eventAggregator;定义事件聚合器

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

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

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

class StartViewModel : Caliburn.Micro.Screen, IShell,IHandle<PersonInfoEven>

然后订阅

this.eventAggregator.Subscribe(this);
public void Handle(PersonInfoEven message){System.Windows.MessageBox.Show(message.ToString());}

04


发布事件

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

IEventAggregator eventAggregator;public void 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


效果演示

731421a5aee862131a74998d29034f29.gif

06


源码

链接:https://pan.baidu.com/s/1IzA0FzOhnMTE0PCU1T9dLw

提取码:在下面公众号后台,发送:提取码3,即可获取

技术群: 需要进技术群的添加小编微信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 为项目设置全局样式

0b8209e8e9680f93b06ea3793fa231db.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的加密算法---数字摘要

数字摘要&#xff1a;数字摘要也称为消息摘要&#xff0c;它是一个唯一对应一个消息或文本的固定长度的值&#xff0c;它是一个单向Hash函数对消息进行计算产生的。摘要生成的过程&#xff1a;待摘要串-----> Hash函数-----> 摘要消息摘要的特点&#xff1a;1.无论输入的…

清华最强本科生Top10出炉,从来没有什么天才学霸!

全世界只有3.14 % 的人关注了爆炸吧知识‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍本文转自&#xff1a;量子位作者&#xff1a;木易 鱼羊一年一度&#xff0c;清华园里的“神仙打架”&#xff0c;投票结果已经出炉。根据清华大学官方消息&#xff0c;2020年清华大学特等奖学金&#x…

day19(中)_IO流3(模拟缓冲区,装饰设计模式)

1.MyBufferedReader和MyBufferedInputStream 1.模拟字符读取流的缓冲区: /*根据readLine原理:自定义一个类包含一个功能和readLine一致的方法来模拟以下BufferedReader方法 */ package myreadline; import java.io.FileReader; import java.io.IOException;class MyBufferedRea…

手把手教你学Dapr - 8. 绑定

介绍使用绑定&#xff0c;您可以使用来自外部系统的事件触发您的应用程序&#xff0c;或与外部系统交互。这个构建块为您和您的代码提供了几个好处&#xff1a;消除连接和轮询消息系统&#xff08;如队列和消息总线&#xff09;的复杂性关注业务逻辑&#xff0c;而不是如何与系…

Android之百度地图定位最详细使用总结

Android之百度定位 如果项目里面有定位功能的话,一般还是觉得蛮高大上的,我们项目用的百度定位,到网上找了很多资料,很多都不全面,很多博客都没有小伙伴期望得到当前的省和城市出来,然后自己动手也有很多错误,不知道错在哪里,也在网上找为什么…

CountDownLatch应用实战

2019独角兽企业重金招聘Python工程师标准>>> 1. CountDownLatch简介 一个同步辅助类&#xff0c;在完成一组正在其他线程中执行的操作之前&#xff0c;它允许一个或多个线程一直等待。其本质就是一个共享锁。 他最主要的作用是用来同步java的线程。 主要有以下三个方…

40张令人震惊的对比图,第一张细思恐极

全世界只有3.14 % 的人关注了爆炸吧知识世界之大&#xff0c;无奇不有。来看Reddit网友们分享的一组对比图&#xff0c;涨涨姿势&#xff01;医生对戴口罩和不戴口罩的培养皿分别&#xff1a;打喷嚏&#xff0c;唱歌&#xff0c;说话和咳嗽之后的区别&#xff08;难怪有些国家疫…

Smark.Data 1.5更新详解

由于一直忙于Beetle的开发和优化&#xff0c;Smark.Data组件已经有很长一段时间更新。这段时间发现Smark.Data在某些情况下不足&#xff0c;而这些情况又比较普遍所以进行了1.5版的更新。其更新的主要功能包括:查询可填充到自定义对象中&#xff0c;可直接执行存储过程和执行存…

C# 数据适配器之 DataAdapter 对象

01 DataAdapter 对象概述DataAdapter 对象是一个数据适配器对象&#xff0c;是DataSet 与数据源之间的桥梁。DataAdapter 对像提供了 4 个属性&#xff0c;用于实现与数据源之间的互通。SelectCommand 属性&#xff1a;向数据库发送查询 SQL 语句。 DeleteCommand 属性&#x…

express 4 简单实现自动注册路由功能

为什么80%的码农都做不了架构师&#xff1f;>>> ##实现 在express&#xff0c;模块的lib/router/index.js 的 proto.route 方法定义附件添加代码&#xff0c;实现自动注册路由方法&#xff1a; var fs require("fs"); var Path require("path&quo…

速战速决?你不会是不行吧......

1 真服了&#xff01;&#xff01;▼2 同猫不同命......▼3 无锡&#xff1a;&#xff1f;&#xff1f;▼4 还是黄金好&#xff1f;▼5 你会不会是不行&#xff1f;&#xff1f;▼6 爸爸&#xff1a;那也太惊喜了...▼7 倒是毫无违和感&#xff1f;▼8 皇上您说的对&…

mysql普通标转分区表_MySQL分区表到普通表互转

由于最近总有人抱怨&#xff0c;数据迁移后执行SQL变慢&#xff0c;经过查看原来是分区导致的问题。原分区根据按月设置RANGE分区&#xff0c;看到这图的时候也许有人就会发现问题.......业务查询SQL&#xff1a;从SQL上看 执行计划确实是走了分区&#xff0c;但为什么没有命中…

C# 用IrisSkin4.dll美化你的WinForm

1. 将IrisSkin4.dll动态文件导入当前项目引用中。具体操作为&#xff1a;解决方案资源管理器->当前项目->引用->右键->添加引用&#xff0c;找到IrisSkin4.dll文件&#xff0c;然后加入即可。建议&#xff0c;最好把IrisSkin4.dll文件放在当前项目\bin\Debug文件中…

全球最大油田、金矿、煤矿、铁矿、铜矿,究竟哪个最值钱?

全世界只有3.14 % 的人关注了爆炸吧知识1世界上最大油田&#xff1a;沙特加瓦尔油田&#xff08;Ghawar Oil field&#xff09;加瓦尔油田位于沙特阿拉伯东部&#xff0c;首都利雅得以东约500km处&#xff0c;它探明的石油可采储量为114.8亿吨&#xff0c;天然气储量9240亿立方…

MVC3快速搭建Web应用(二)

easyui与mvc的结合 上一篇文章发布后&#xff0c;自己又仔细读了数遍&#xff0c;感觉一是文笔太差&#xff0c;二是描述逻辑比较混乱&#xff0c;客观原因是涉及到东西其实蛮多的&#xff0c;那三个步骤不可能在一篇短短的文章中就可以描述清楚。此篇笔者将尽量更加详尽一些。…

这个发热鞋垫厉害了,有它冬天再也不怕脚冷

▲ 点击查看冬天一到&#xff0c;小爆发现身边的“抖友”又开始上线了&#xff01;至于为什么会抖脚&#xff1f;有盆友说&#xff0c;当然不是真的想抖&#xff0c;而是因为脚太冷冷冷了&#xff01;有时候穿了棉袜厚鞋&#xff0c;脚都是冷冰冰的&#xff0c;感觉就像踩在冰窟…

.NET 6新特性试用 | 热重载

前言在以前的开发模式下&#xff0c;我们修改代码后必须重新编译、重新运行才能看到效果。而热重载提供了这样一种特性&#xff0c;它允许你在项目正在运行时修改代码&#xff0c;并将代码更改立即应用于正在运行的应用程序上。热重载的目的是尽可能节省编辑之间的应用重启次数…

加速你的Hibernate引擎(上)

为什么80%的码农都做不了架构师&#xff1f;>>> 1.引言 Hibernate是最流行的对象关系映射&#xff08;ORM&#xff09;引擎之一&#xff0c;它提供了数据持久化和查询服务。 在你的项目中引入Hibernate并让它跑起来是很容易的。但是&#xff0c;要让它跑得好却是需…

Spring MVC 中 HandlerInterceptorAdapter过滤器的使用

一般情况下&#xff0c;对来自浏览器的请求的拦截&#xff0c;是利用Filter实现的&#xff0c;这种方式可以实现Bean预处理、后处理。 Spring MVC的拦截器不仅可实现Filter的所有功能&#xff0c;还可以更精确的控制拦截精度。 Spring为我们提供了org.springframework.web.s…

7部必看的纪录片,每一部都堪称经典,让人叹为观止!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片的一大重要意义&#xff0c;就在于它能将我们的视野和脚步&#xff0c;引向我们无法企及的地方和领域&#xff0c;又能让那些我们曾经到过的地方、经历过的人事&#xff0c;变得更有深意。今天&#xff0c;就给大家分享7部顶级纪录…