2009-11-24 36 views
4

我正在構建一個WPF應用程序並試圖符合MVVM最佳實踐。我正在使用MVVM Foundation框架,並注意到Messenger類,我讀過它應該用於handling dialogs in WPF。這聽起來不錯,但我完全不知道如何使用Messenger來達到此目的。從字面上看,我想要做的就是打開一個關於模式的對話框 - 我不需要來回傳遞任何消息。使用MVVM Foundation Messenger顯示對話框

Messenger類的意圖是用於對話框需要來自其父對象的消息還是將消息返回給其父對象的情況?對於關於對話框來說這是否過分了?只需將代碼添加到事件處理程序以顯示對話框,我會更好嗎?

回答

5

消息傳遞模式背後的想法並不特別與顯示對話有關。這個想法只是提供ViewModels之間進行通信的解耦方式。

你可以利用這個基礎設施來解決你的問題,但你必須自己實現對話框的顯示。

正如Phillip所示,您可以在ViewModels之間發送消息。當你的ViewModel收到消息時,它可以將它自己的內部屬性設置爲true,比如說「ShowDialog」。

然後,您可以擁有一個對此屬性更改操作作出反應的綁定並打開一個對話框。

我還建立了從Josh的想法借用MVVM模式一個簡單的消息框架(和其他幾個現有框架),你可以讀到它here

+0

Oooohhh .....這使得很多更有意義,現在。 MyViewModel向AboutViewModel發送消息,AboutViewModel打開關於對話框。這絕對清除了我的困惑。非常感謝你。 – senfo 2009-11-25 01:09:45

+0

沒問題,很高興幫助 – 2009-11-25 01:35:24

3

假設您有父視圖和對話框視圖。在MVVM中,他們都會有一個視圖模型。保持這些視圖模型的解耦是很好的,也就是說它們沒有彼此的引用。然而他們需要相互溝通。信使類充當中間人或調解人的角色,以調解兩個類之間的信息交流。請參閱從Josh's blog獲取的代碼。

alt text

這裏是對象A.這是調用調解員的註冊方法實現:當我收到消息ObjectBSaidSomething,由調解員,我會在成員WhatObjectBSays緩存它。

alt text

這裏是對象B,它實現了:我要發送消息ObjectBSaidSomething。請注意,對象B對對象A一無所知。可能不會偵聽ObjectBSaidSomething,或者有100個對象偵聽ObjectBSaidSomething,但對象B不知道也不在乎。這是很好的解耦,這就是爲什麼Mediator模式是個好主意。這就是MVVM基金會建議在視圖模型之間傳遞信息的方式。