最近對委託、事件的訂閱使用的太多,訂閱與被訂閱之間的綁定約束很是...麻煩,因此翻了下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也能夠,但必須有
下一節對這段源碼拿出來看下什麼狀況,挖坑待填
接上文: