01
前言
处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Caliburn提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯,且彼此之间没有引用,这就实现了模块之间低耦合的通信方式。简单来说就是提供了一个多播发布/订阅功能。Caliburn的事件聚合器,这玩意实现原理是观察者模式,观察者模式也就是常说的发布/订阅模式。
02
创建事件
这里我们创建一个公共接口类PersonInfoEven并继承自PubSubEvent,并传入一个PersonInfo对象
代码语言:javascript复制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获取事件聚合器实例
代码语言:javascript复制this.eventAggregator = IoC.Get<IEventAggregator>();
注意需要继承接口IHandle<PersonInfoEven>
代码语言:javascript复制class StartViewModel : Caliburn.Micro.Screen, IShell,IHandle<PersonInfoEven>
然后订阅
代码语言:javascript复制this.eventAggregator.Subscribe(this);
代码语言:javascript复制 public void Handle(PersonInfoEven message)
{
System.Windows.MessageBox.Show(message.ToString());
}
04
发布事件
可以选择同步发布或者异步发布:
代码语言:javascript复制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
效果演示
06
源码
链接:https://pan.baidu.com/s/1IzA0FzOhnMTE0PCU1T9dLw
往期推荐
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 为项目设置全局样式