博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
阅读量:6609 次
发布时间:2019-06-24

本文共 5549 字,大约阅读时间需要 18 分钟。

今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子

看一它的的实现和源码

下一篇用它们做一个多语言的demo

这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突。

先看一下它的实现思想

在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以做到对广播做到统一的管理

对象实现IHand<T>接口后通过EventAggregator的subsribe方法把自己加入到Handler集合中这样就能接叫信息

能过EventAggregator.Publish(object obj)方法去发送广播

源码: 

先看一下个小demo再去分析它的源码是怎么实现的

效果

     

先写一个消息类,这个类只是做一个IHandle<T>的类型应用没有什么实际意义

class MyMessage    {        public string Str        {            get;            set;        }        public override string ToString()        {            return Str;        }    }

建一个窗体MainView和一个ViewModel类

窗体有一个textBox显示消息。一个button打开窗体一个发布消息

再看一下ViewModel

实现 了两个IHandle<T> 一个是string 类型一个是我们自己定义的MyMessage

MainViewMode发布string类型的广播也接收string类型和MyMessage类型的消息

[Export(typeof(IShell))]    class MyMainViewModel : PropertyChangedBase, IHandle
,IHandle
{ readonly IEventAggregator _events; readonly IWindowManager _windowManager; string strMessage; public string StrMessage { get { return strMessage; } set { strMessage = value; NotifyOfPropertyChange(() => StrMessage); } } [ImportingConstructor] public MyMainViewModel(IEventAggregator e,IWindowManager win) { _events = e; _events.Subscribe(this); _windowManager = win; } public void Handle(string message) { StrMessage = message; } public void Handle(MyMessage message) { StrMessage = message.ToString(); } #region public void Publish() { _events.Publish(StrMessage); } #endregion #region 打开窗体 public void OpenOneWin() { OneCViewModel _one=new OneCViewModel(); _windowManager.ShowWindow(_one); } #endregion

再建一个窗体做接收和广播

它只接收string类型的消息和发布MyMessage类型的消息

1
using Caliburn.Micro;using CaliburnIHandle.CommonC;using System;using System.Collections.Generic;using System.ComponentModel.Composition;using System.Linq;using System.Text;namespace CaliburnIHandle.MyViewModels{    [Export(typeof(OneCViewModel))]    class OneCViewModel : PropertyChangedBase, IHandle
{ readonly IEventAggregator _event; string oneMessage; public string OneMessage { get { return oneMessage; } set { oneMessage = value; NotifyOfPropertyChange(() => OneMessage); } } public OneCViewModel() { _event = IoC.Get
(); _event.Subscribe(this); } public void OnePublish() { _event.Publish(new MyMessage { Str = OneMessage + " One!" }); } public void Handle(string message) { OneMessage = message; } }}

这是一个很简单的例子我们看一下Caliburn.Micro源码它是怎么实现的

 

看一下IHandle<T>接口

public interface IHandle
: IHandle { //don't use contravariance here ///
/// Handles the message. /// ///
The message. void Handle(TMessage message); }

IHandle<T>只有一个处理T事件的的方法

EventAggregator类通过

///         ///   Subscribes an instance to all events declared through implementations of 
///
/// The instance to subscribe for event publication. public virtual void Subscribe(object subscriber) { if (subscriber == null) { throw new ArgumentNullException("subscriber"); } lock(handlers) { if (handlers.Any(x => x.Matches(subscriber))) { return; } handlers.Add(new Handler(subscriber)); } }

把订阅的类放到Handlers集合里

再通过Publish发布相应的消息

///         ///   Publishes a message.        ///         /// The message instance.        /// 
/// Does not marshall the the publication to any special thread by default. ///
public virtual void Publish(object message) { if (message == null) { throw new ArgumentNullException("message"); } Publish(message, PublicationThreadMarshaller); } /// /// Publishes a message. /// /// The message instance. /// Allows the publisher to provide a custom thread marshaller for the message publication. public virtual void Publish(object message, Action
marshal) { if (message == null){ throw new ArgumentNullException("message"); } if (marshal == null) { throw new ArgumentNullException("marshal"); } Handler[] toNotify; lock (handlers) { toNotify = handlers.ToArray(); } marshal(() => { var messageType = message.GetType(); var dead = toNotify .Where(handler => !handler.Handle(messageType, message)) .ToList(); if(dead.Any()) { lock(handlers) { dead.Apply(x => handlers.Remove(x)); } } }); }

 

转载地址:http://nziso.baihongyu.com/

你可能感兴趣的文章
Ubuntu 12.04安装字体
查看>>
nyoj528-找球号(三) 【位运算】
查看>>
MPI编程简单介绍
查看>>
ios开发版证书与企业证书相关文件申请安装及其使用方法
查看>>
利用XSD配合XSLT產出特定格式Word檔案 -摘自网络
查看>>
初识EPC
查看>>
从Facebook跑来阿里的赵海平大叔,你要干啥?
查看>>
ZH奶酪:VirtualBox虚拟机与主机ping不通
查看>>
被我们忽略的HttpSession线程安全问题
查看>>
Clever Little Box 电缆组件 USB A 插座 至 USB B 插头
查看>>
Oracle如何实现创建数据库、备份数据库及数据导出导入操作
查看>>
使用SecureCRT的SFTP在WINDOWS与LINUX之间传输文件
查看>>
页面制作之开发调试工具(1)
查看>>
jekyll bootstrap搭建github blog
查看>>
Flex4 vs Flex3: Repeater vs DataGroup
查看>>
插入排序算法
查看>>
程序启动的完整过程
查看>>
C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)...
查看>>
Android 禁止屏幕休眠和锁屏的方法
查看>>
Android Paint、Canvas、Matrix使用讲解(一、Paint)
查看>>