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