2010-06-10 87 views
3

我有一個應用程序,它具有任務選項卡和項目選項卡。我決定爲每個選項卡TasksViewModel和ProjectsViewModel製作一個單獨的ViewModel。跨ViewModels共享狀態/更改

「任務」選項卡具有一個新的任務區,其中包含關聯的項目下拉菜單,而「項目」選項卡(顯然)具有項目列表。

我想要的是在任務選項卡上的下拉菜單與項目選項卡列表共享相同的集合,這樣任何時候我在項目選項卡上添加或移除項目時,任務選項卡上的列表都取決於自動日期。這與單個ViewModel很好地協作,但它開始變得相當不穩定。

我是不是應該分成兩個ViewModels?有沒有像這樣共享數據的常用方法?也許通過相同的ObservableCollection<Project>到每個ViewModels?也許某種類型的通知沿着ICollectionChanged的行回到TasksViewModel。

感謝任何見解/輸入!

回答

4

這裏最簡單的解決方案通常是使用某種形式的消息傳遞服務在兩個ViewModels之間傳遞信息。例如,MVVM Light Toolkit爲此類情況提供IMessenger interface

使用一個好的IoC或DI工具集也可以在這種情況下提供幫助。這可以讓你動態地將項目集合注入到你的兩個ViewModel中,從而允許在兩個視圖中使用共享集合。

+0

我同意,但只有當數據真的是視圖模型的一部分,而不是模型的一部分。如果它實際上是模型的一部分,我會說在視圖模型之間來回傳遞它將是一個非常糟糕的想法:在整個應用程序中共享單個模型會更好。我在答案中進一步解釋了這一點。 (是的,我意識到DI是完成共同模式共享的一種好方法,但我認爲確定它是非常重要的)。 – 2010-06-12 00:48:14

+0

Thaks裏德,我喜歡這個消息傳遞的想法。我在WebformsMVP框架中使用了類似的功能。 – joshperry 2010-06-16 22:22:17

3

在我看來,你的「任務」和「項目」的概念是你的模型的一部分,而不是你的視圖模型的一部分。

考慮這個概念練習:假設你的應用程序是這麼寫的兩個用戶可以在兩個獨立的機器上使用您的應用程序對一個共享的數據庫,以及一個用戶增加了一個項目:

  1. 難道是好還是如果項目立即出現在其他用戶屏幕的「任務」選項卡上的下拉列表中,這是不好的一件事情?
  2. 如果在第一位用戶點擊「保存」或「提交」或「確定」後,項目出現在該下拉列表中,這會是好事還是壞事?

如果答案要麼這些問題是「一件好事」,你的數據真的是你的模型不是你視圖模型的一部分。它應該像這樣處理。

您的視圖模型應該引用您的實際模型,儘可能在視圖模型之間共享模型對象是一件好事。實際上,理想情況下,大多數應用程序都有一組模型對象。例外可能是一個對話框,您希望能夠進行一些更改,但點擊「取消」並不保存它們。在這種情況下,「確定」按鈕會將數據從您的對話框維護的模型複製到主應用程序模型中。在這種情況下,對話框和主應用程序使用的模型對象是同一類的不同實例。

現在讓我們考慮一下你對這兩個問題回答「壞事」的情況。這將是一個應用程序,您永遠不會將您的「項目」列表保存到主數據庫/文檔/任何內容中,但這是一個僅用於臨時工作的臨時列表。在這種情況下,它確實是一個視圖模型,我將它附加到應用程序(或任何合適的範圍),並讓這兩個標籤訪問它。

+0

「如果對這兩個問題中的任何一個的回答都是'是'」,當問題是「如果......會好還是不好?」會引起混淆。 「是」,「好」還是「壞」? – JohnMetta 2011-01-04 22:22:39

+0

感謝您的支持。我已更正了文字。 – 2011-01-05 16:29:05