WPF之Messenger
阿新 • • 發佈:2021-12-05
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, boolkeepTargetAlive = 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>
效果: