2011-03-23 161 views
0

仍試圖找到更復雜的MVVM場景的好例子...在一個視圖中的視圖模型/實體或多個視圖模型的多個視圖?

假設我有一個viewmodel - PlayersViewModel有一個球員的集合。在一個視圖中,我看到了玩家的集合並添加/編輯/刪除。

另一種觀點是球隊,我在那裏分配給玩家團隊。所以我有另一個viewmodel - TeamsViewModel。這個視圖還需要一系列玩家。如何讓兩個播放器列表保持同步,以便在兩個視圖中顯示更改?

我看到了一些選擇:

  1. 添加到PlayersViewModel參考我的團隊視圖(以及以TeamsViewModel參考),並在這兩種觀點
  2. 有兩臺使用PlayersViewModel.Players集合引用相同的底層集合實例(在某種程度上)
  3. 不同集合創建像Player.All播放器模型,返回集合的靜態屬性和通過的ViewModels Player.Add(播放器),Player.Delete等管理玩家而不是PlayersViewModel.AddPlayer(播放器)?

我傾向於#1,並使用應用程序範圍的資源,因此團隊視圖可以調用兩個視圖模型。但是,如何在我的TeamsViewModel的PlayersViewModel.Players集合中使用選定的播放器來添加它們?

請幫忙!

回答

1

我堅強而快速的規則是每個視圖都有一個ViewModel,所以在我的書中,您正處於正確的道路上。不要將PlayersViewModel與玩家數據混淆:PlayersViewModel面向玩家視圖,而不是玩家數據。換句話說,兩者是分開的,所以你不需要在其他ViewModel中重用PlayersViewModel。我道歉,如果我不解釋這口井......

如果需要多個的ViewModels與數據的同一個實例來顯示,然後在應用層面而非文檔級定義數據。你可以讓玩家靜態,或者你可以讓它實現Singleton模式:這些東西都不是特定於ViewModel的,因爲ViewModel只消耗資源。

+0

感謝Joel,看來我正在朝着這個方向前進,並且將viewmodels映射到我的視圖上。我的視圖模型目前非常大,所以看起來我需要與我的視圖模型和實體框架對象一起使用另一項服務 - 就像一個智能數據存儲庫,其中包含像當前的Players集合一樣的東西。儘管EF在這裏看起來似乎有些翻了一番,EF應該爲我做些什麼。 – DaveO 2011-03-24 08:43:19

+0

考慮添加您的ViewModel訪問它所需類的服務層。該服務可以使用對EF的存儲庫模式,您可以使用DI設置它或使用上面討論的其他方法之一。你的虛擬機不應該做所有的EF工作,它應該與那個層進行通信。 – 2011-03-24 14:23:03

0

使用單個ViewModel。讓不同的視圖只顯示他們需要的東西。關於玩家的集合:WPF允許您擁有同一個集合的多個視圖,並且每個視圖都具有不同的過濾/排序/分組。見Binding to Collections

+0

您的意思是將PlayersViewModel和TeamsViewModel合併爲一個視圖模型?或者使用相同的viewmodel來引用Player集合?仍然不確定如何從我的TeamsViewModel(如果我們不合並)訪問Player集合(或基於它的當前列表視圖選擇)。謝謝! – DaveO 2011-03-23 07:08:36

+0

是的,我的意思是結合兩個視圖模型。至於選擇,爲什麼不在視圖模型中添加屬性並在玩家視圖中綁定屬性,即SelectedItem = {Binding SelectedPlayer}(當然,這僅適用於單選模式)。對不起我的英語不好 :)。 – 2011-03-23 07:34:00

+0

選擇對於一個視圖模型沒有問題。但是,這是如何擴大的?即我們現在在視景模型和球員隊伍中擁有一組球隊,如果我需要一系列比賽,我也會把它放在視圖模型中嗎?這不會導致整個應用程序的一個超級viewmodel?謝謝! – DaveO 2011-03-23 07:42:00

0

Personnally,爲了更容易理解,我每次觀看一個視圖模型。 這意味着每個自定義UserControl都有自己的ViewModel,處理它自己的操作。 我正在研究一個非常大的項目,並提供了很多視圖,我認爲每個視圖都有一個ViewModel會更清潔。它幫助我正確地閱讀我的架構,因此我不會將角色混合到獨特的ViewModel中。

但是,我不能保證你是應該做的最好辦法。我2個星期前開始在WPF/MVVM工作,我想通了,這將會是更容易這樣理解(我用我的程序分成儘可能多的參加可能的,因爲我認爲這是更易於維護)