最近对委托、事件的订阅使用的太多,订阅与被订阅之间的绑定约束很是...麻烦,因此翻了下MVVMLight源码找出这段能够拿出来用的部分,详情见下:html
一.开发中遇到的问题:框架
场景1:ClassA中存在事件OnDataChanged,在数据发生改变时调用OnDataChanged事件通知其订阅者ClassB作相应处理工具
问题:发生订阅这件事儿永远都须要前提条件,订阅方与被订阅方必须直接接触到才能够实现该逻辑,这样在不须要订阅与被订阅的对象接触时就很差处理逻辑了post
场景2:A、B两我的合做,分别写订阅方逻辑、被订阅方逻辑this
实现过程当中,会遇到以下问题:url
二.MVVMLight中消息通知机制的对外实现spa
/// <summary>
/// 注册订阅事件
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="recipient">订阅实例</param>
/// <param name="token">发送与接收定义的key值</param>
/// <param name="action">订阅事件触发的action</param>
/// <param name="keepTargetAlive">持续控制实例存在,防止被回收清除</param>
public virtual void Register<TMessage>(object recipient,object token,Action<TMessage> action,bool keepTargetAlive = false)调试
/// <summary>
/// 被订阅方触发事件
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="message">参数数据</param>
/// <param name="token">key</param>
public virtual void Send<TMessage>(TMessage message, object token)code
例htm
public class Class1 { public Class1() { MessageTool.Messenger.Default.Register<string>(this, "key", DataChangedHandle); } //订阅触发事件 public void DataChangedHandle(string obj) { //dosomething } /// <summary> ///对外通知事件消息 /// </summary> public void SendMessage() { MessageTool.Messenger.Default.Send("Message", "key"); } }
逻辑解释:
优势:避免订阅与被订阅的实例接触、事件参数命名发生改变时影响变小,最多触发不到,不会影响编译
缺点:我看到的必须有传参,即便null也能够,但必须有
下一节对这段源码拿出来看下什么状况,挖坑待填
接上文: