2011-06-28 53 views
2

我有一個基於MVVM/WPF的應用程序,可以同時打開多個工作區(基本上包含一個TreeView),並在相同的數據樹上進行顯示和操作。我需要能夠展開和摺疊並獨立選擇每個工作區中的項目,並且希望能夠在兩個工作區之間拖放項目(例如移動或複製項目)。我還需要數據虛擬化,因爲只有在第一次擴展樹項目時纔會加載數據(在兩個視圖中)。還有一個工作區範圍的詳細信息視圖,顯示當前具有焦點的工作區的選定項目的詳細信息。工作區特定擴展和項目選擇也必須以編程方式工作。我應該如何在相同的數據上實現多個視圖?

你能爲基於MVVM的應用程序設計一個流行設計嗎?它包含了這些功能?我應該爲每個工作區創建一個單獨的ViewModel樹並實現Model-ViewModel映射器嗎?或者我應該只有一個ViewModel樹和兩個Views?細節視圖如何知道當前選定的內容以及哪些工作區具有重點? ...

因此,重新表述我的問題:每個視圖中顯示的模型實例實際上是相同的實例。但是,ViewModels應該是一樣的嗎?或者更好:我能否擺脫這種困境?

另請參見:是否有開放源代碼的應用程序,我可以學習,其中大部分功能? Prism或任何其他基於MVVM的框架能爲我完成大部分工作嗎?

回答

0

也許我錯過了一些東西,但它不可能有2個相同的View/ViewModel加載不同的數據的實例嗎?

+0

是的,這是可能的。我有一個模型(數據樹),但它需要兩個相當獨立的視圖。我是否應該有兩個ViewModel樹(每個視圖一個)都指向相同的模型?或者我可以用2個視圖中綁定的一個ViewModel樹?我的問題是面向上述相當普遍的要求的一個總體「最佳實踐」。 – bitbonk

2

View和ViewModel之間有直接關係。該視圖顯示了ViewModel託管和「格式化」模型的可視化表示形式。由於您將在每個視圖上有不同的模型(數據),因此您需要有多個ViewModel實例託管每組不同的數據。

現在的問題是:你的ViewModels共享它們之間的一些實體或對象嗎? 如果是,它們可以在應用程序生命週期中更改嗎?是否希望在TreeView中實時查看這些更改?

然後你有兩種選擇:

  1. 直接綁定模型到視圖(如果模型實現INotifyPropertyChanged的)通過您的視圖模型暴露它:那麼所有的意見都會自動更新,當一個模型財產變化。
  2. 創建一個組件監督模型修改並通知ViewModel公開它們。

第二個解決方案比第一個解決方案更純粹,因爲模型應該是POCO,不應該實現一些面向管道的界面。 ViewModel應該處理管道。

但是它更復雜的設計,而90%的時候,你會最終達說:「來吧,只是一個小小的接口不傷害」 :)

爲了您細節來看。您可以使用調解器(MVVM Light Toolkit中的Messenger)在您的TreeViewModel和DetailViewModel之間進行通信,該調解器基本上是一個低耦合的面向事件的組件。或者使用注入所有ViewModel的主管,並使用事件通知他們。說到MVVM框架,對於像你所描述的常見體系結構,我會推薦MVVM Light Toolkit

+0

所以你說我應該去多個ViewModel路線?只是爲了確保:我沒有在每個視圖上有不同的模型(數據)。我有多個視圖一個*相同*數據(模型)。顯示在每個視圖中的Model實例實際上是相同的實例。但是,ViewModels應該是一樣的嗎?或者更好:我可以逃脫嗎? – bitbonk

+0

如果我很好地理解了你,你希望啓用不同TreeView之間的拖放。因此,您的ViewModel中封裝的項目集合可能會發生變化。有些會丟失物品,其他人會獲得一些。然後,對於所有視圖,您不能擁有一個ViewModel,因爲每個ViewModel的集合不等於。 我認爲可以有一些例外,你可以擺脫ViewModel真的很簡單的情況。但這意味着你已經在你的模型中加入了管道。但是,再一次,它應該是ViewModel的工作。無論如何,它似乎不適合你的情況。 – Roubachof

+0

等待:如果從一個VM樹拖到另一個基於相同Model的VM樹,則拖放操作仍會導致兩個VM樹具有完全相同的數據。因此,兩棵樹將總是*具有完全相同的數據結構,對嗎?只是它們的擴展和選擇狀態是不同的。在兩個ViewModel樹之間拖放並不是在* same * Model-tree中移動或複製項目。 – bitbonk

相關問題