4

考慮以下情形:視圖模型視圖模型來溝通

  1. ViewModelA推出ViewModelB(通過一個共同的控制器,當然,使用IOC和DI解決所需要的類型)。
  2. ViewModelB需要在ViewModelA中設置一個屬性值。

通過構造函數注入簡單地將ViewModelA注入ViewModelB並直接設置屬性是不好的?

或者......

如果一個郵件系統像棱鏡的EventAggregator被用來處理的ViewModels之間的所有通信?

我喜歡注射方法,因爲它很容易,但我的直覺告訴我我錯過了一些東西。我呼籲你集體的智慧來幫助填補我的盲點。

回答

1

我建議你閱讀this question (and my answer),因爲它很相似,但不完全是你的問題。它處理父/子ViewModel對象之間的屬性通信。

讓我們看一個簡單的例子:

  • ViewModelA是父母必須對B存在某些屬性的總和
  • ViewModelB是兒童和有需要總結
屬性

因此,用戶請求編輯B上的屬性並且請求成功,因此B可能會更改其屬性的值並觸發一個PropertyChanged事件。

ViewModelA可以訂閱所有孩子的活動,但走下了這條路,我不喜歡它。當孩子被添加和刪除時,你需要做很多記錄。

將A注入B更清潔,但您仍然需要大量的簿記工作。如果你對A有「清除兒童」行爲會怎麼樣?在所有情況下,你必須記得妥善擺脫B到A的父母關係。在我看來,它比事件更好,因爲它更加明確。

我個人喜歡這個消息傳遞的想法。我對MVVM Light的使者比Prism更熟悉,但它也是一個全球性的消息總線。任何時候,任何B都可以說「我改變了我的財產!」然後A監聽通知並執行計算本身。我認爲這是您最簡潔的解決方案,而且更少簿記。

+0

我最終創建了一個包裝EventAggregator的Publish/Subscribe/Unsubscribe操作的MessagingService。 MessagingService被注入到ViewModelBase類中,因此我的應用程序中的任何ViewModel都可以使用它。 – 2011-01-28 22:41:57

+0

@Chris Swain - 我喜歡它。如果我必須將ViewModel與ViewModel進行通信,那麼我將在未來採用這種方法。但是,在我最近的工作中,我通過強制模型中的所有通信來避免所有這些情況。當模型中發生任何變化時,我的Presenter知道它並告訴頂層ViewModel有可能發生了變化。然後,它向樹和所有子級,孫級等傳遞一個通知,ViewModels檢查它們的模型數據以查看是否有任何更改。 – 2011-01-29 16:52:11

2

如果您需要雙向引用,我認爲它是一種代碼異味。通常,您可以用替換其中一個參考文獻,其事件爲

讓ViewModelB引發ViewModelA預訂的事件。一個完整的消息系統就像在Prism中找到的那樣,當然是一種選擇,但在你的場景中,這聽起來像是一個'正常'的事件會很好。

0

我建議使用更輕的專用Messaging解決方案稱爲「Light Message Bus」。它不是任何其他的一部分;-) MVVM框架,但獨立的組件。我在不到3分鐘的時間內即可完成工作。