WPF之Messenger


 Messenger

 使用這個可以解耦業務代碼和視圖之間的強引用。在注冊之后,只有使用同一種令牌發送消息,才會觸發事件來執行對應的方法。

//
        // 摘要:
       //為某種類型的消息 TMessage 注冊一個接收者。 當發送相應的消息 
      //時,將執行 action 參數。 有關如何接收從 TMessage 派生的消息 
     //(或者,如果 TMessage 是接口,則實現 TMessage 的消息)的詳 
     //細信息,請參閱 receiveDerivedMessagesToo 參數。 注冊接收者 
   //不會創建對它的硬引用,因此如果刪除此接收者,則不會導致內存泄漏。
        //
        // 參數:
        //   recipient:
        //     將接收消息的收件人。
        //
        //   token: 消息通道的令牌。 
       // 如果收件人使用令牌注冊,並且
         // 發送者使用相同的令牌發送一條消息,然后這條消息將被傳遞
         // 給收件人。 注冊時未使用令牌的其他接收者(或
         // 誰使用了不同的令牌)將不會收到消息。 同樣,發送的消息
         // 沒有任何令牌,或使用不同的令牌,將不會傳遞給該接收者。
        //
        //   action:發送 TMessage 類型的消息時將執行的操作。
       
         //
         // 保持目標活着:
         // 如果為 true,則 Action 的目標將作為硬引用保留,這可能
         // 導致內存泄漏。 如果操作,您應該只將此參數設置為 true
         // 正在使用閉包。 請參閱 http://galasoft.ch/s/mvvmweakaction//
        // 類型參數:
        //   TMessage:
        //    收件人注冊的消息類型。
        void Register<TMessage>(object recipient, object token, Action<TMessage> action, bool keepTargetAlive = false);

 

 示例:

后台:

namespace MyWpf
{
    /// <summary>
    /// MyMessenger.xaml 的交互邏輯
    /// </summary>
    public partial class MyMessenger : UserControl
    {
        public MyMessenger()
        {
            InitializeComponent();
            this.DataContext = new BussinessLayer();
            //第一步:注冊
            //接收人為當前控件,令牌為TestToken,執行方法為GetData
            Messenger.Default.Register<string>(this, "TestToken", GetData);
        } 
        /// <summary>
        /// 第三步:處理接收到的信息
        /// </summary>
        /// <param name="obj"></param>
        private void GetData(string obj)
        {
            MessageBox.Show(obj);
        }
    }

    /// <summary>
    /// 一個測試的業務層
    /// </summary>
    public class BussinessLayer
    {
        public BussinessLayer()
        {
            Open = new RelayCommand(Test) ;
        }
        public RelayCommand Open { get; set; }


        private void Test() {
            //第二步:向令牌為TestToken的Messenger發送信息
            Messenger.Default.Send("測試Messenger", "TestToken");
        }
    }
}

 

xaml:

<UserControl x:Class="MyWpf.MyMessenger"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyWpf"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Button Command="{Binding Open}" Content="測試" Width="200" Height="100"></Button>
    </Grid>
</UserControl>

 

 

效果:

 

 

  

利刃 MVVMLight 9:Messenger

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM