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 — 效果演示 06 — 源码 链接:https://pan.baidu.com/s/1IzA0FzOhnMTE0PCU1T9dLw |
|
来自: ontheroad96j47 > 《待分类》