2013-07-04 56 views
1

我確信之前已經詢問過這個問題,但我無法得到正確答案。MVVM Light Messages - 多個ViewModel實例

這裏的場景:

我有一個網格,每行上有兩個圖形。點擊上Graph1的東西,將使用從代碼的背後Graph1的消息:

Messenger.Default.Send<MyCustomMessageType>(message); 

然後,在我的視圖模型爲圖2,我註冊在構造函數中:

Messenger.Default.Register<MyCustomMessageType>(this, (message) => UpdateDataContext(message)); 

的問題是,發送,現在將它發送到該類型的ViewModel的所有實例(這是有道理的)。

如何阻止這種情況發生?

+0

您可以使用用作消息密鑰的令牌。 – loop

+0

你好。我已閱讀有關令牌..但如何使用它們?我如何知道在我的接收視圖模型中使用哪個令牌?我的ViewModel不立即構建 – Fox

回答

3

發送令牌到指定的接收器

void Register<TMessage>(object recipient, object token, Action<TMessage> action); 
void Send<TMessage>(TMessage message, object token); 

例子:

MessengerInstance.Register<Foo>(this, "thespecialone", theFoo=> FunctionFoo(theFoo)); 
MessengerInstance.Send<Foo>(message, "thespecialone"); 
+0

感謝您的回答。根據上述..在我接收的ViewModel中,我將如何獲得在消息和模型之間共享的唯一密鑰 – Fox

+0

您需要使用密鑰註冊並再次使用密鑰發送。 –

+0

好吧,我明白你在說什麼..讓我試試 – Fox

0

感謝所有的答案。這個消息不是我的問題。問題是,我不應該使用ViewModelLocator。因爲每一行都需要自己的ViewModel,所以我擺脫了使用ViewModelLocator並在控件的Onload中實例化了ViewModel,並將其設置爲Datacontext。感謝您的建議,但。

0

首先,您可以註冊構造函數之外的消息的視圖模型,最好在ioc中註冊。其次,不要使用Default(singleton),根據特定的視圖模型組管理Messanger實例。這種方法最大的好處之一(除了明顯有用的粒度和解耦)是對代理的支持。