[英]Does the MVVMLight messenger have scope?
想象一個WPF應用程序,其中一個主視圖代表一個可以多次打開的窗口。 該主視圖有幾個子視圖。
Messenger可以在主視圖的視圖模型與其子視圖的視圖模型之間發送消息。
可以使Messenger的范圍受到限制,以便在打開兩個主視圖時與之交互只向該視圖的子視圖發送消息嗎?
是否有另一種方式可以以尊重MVVM的方式在父視圖模型和子視圖模型之間共享“身份”?
您可以使用“令牌”的概念來實現此效果。
IMessenger
接口的Register
和Send
重載接受對象,以限制哪些注冊者接收消息。 如果使用令牌發送消息,則唯一會看到該消息的對象是使用相同令牌為消息注冊的對象。 在這里,“相同”表示對象相等,因此您可以將具有合理的相等語義且對您有意義的任何對象用於令牌,即GUID,整數或字符串。
例如,請考慮以下對象:
public static class MessengerHelper
{
public static IMessenger Messenger { get { return GalaSoft.MvvmLight.Messaging.Messenger.Default; } }
public static object Group1Token { get { return 1; } }
public static object Group2Token { get { return 2; } }
}
public class FooChild
{
object token;
public FooChild(object token)
{
this.token = token;
MessengerHelper.Messenger.Register<IFooMessage>(this, token, HandleFooMessage);
}
void HandleFooMessage(IFooMessage fooMessage)
{
Console.WriteLine("FooChild got the message, token = " + (token ?? "(null)"));
}
}
public class FooParent
{
FooChild[] children;
public FooParent()
{
children = new [] {
new FooChild(MessengerHelper.Group1Token),
new FooChild(MessengerHelper.Group2Token),
new FooChild(null)
};
}
public void SendFooMessage(IFooMessage fooMessage, object token)
{
MessengerHelper.Messenger.Send(fooMessage, token);
}
}
然后,如果您創建父級並發送帶有給定令牌的消息:
FooParent parent = new FooParent();
parent.SendFooMessage(new FooMessage(), MessengerHelper.Group1Token);
parent.SendFooMessage(new FooMessage(), MessengerHelper.Group2Token);
您將獲得以下輸出:
FooChild收到消息,令牌= 1
FooChild收到消息,令牌= 2
對於您的情況,您將希望每個主視圖模型都有自己的令牌,並將其令牌傳遞給子視圖模型。
您始終可以在傳遞默認的IMessenger
(具有靜態 ,應用程序域范圍)或創建Messenger的新實例之間進行選擇:
var domainWideMessenger = GalaSoft.MvvmLight.Messaging.Messenger.Default;
var localMessenger = new Messenger();
當您不想控制Messenger的范圍時,第一種方法很有用。 您可以將其視為中央樞紐。 “本地”信使非常適合在VM或某些容器內進行通信。
為什么這比擁有令牌更好? 當您擁有基於令牌的消息傳遞的高級應用程序時,您將在處理它們時遇到困難(選擇正確的令牌)。 特別是在涉及依賴注入時。
在您的情況下,每個MainView
將具有Messenger
新實例,該實例將被下推到其所有子視圖和視圖模型。 要在MainView
多個實例之間同步數據並進行通信,請使用MVVM Light中的靜態Messenger
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.