1. 程式人生 > 其它 >WPF之Messenger

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