2011-04-09 171 views
5

當我讀到這裏:在MVVM中,每個View Model只能有一個View?

http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

通常有一個視圖,其 視圖模型之間的一到一個 關係。

這意味着通過設計他們並不真正處理多個視圖?

+1

其實多個視圖可以使用一個視圖模型(例如不同類型的圖表)。也可以通過使用DataTemplateSelector來切換這些視圖,這裏是我對另一個問題的回答,我創建了一個這種情況的例子:http://stackoverflow.com/questions/5309099/changing-the-view-for-a-viewmodel/ 5310213#5310213 – vorrtex 2011-04-09 19:19:34

+0

感謝您閱讀,但我有一個datatemplateselector問題http://stackoverflow.com/questions/5607619/how-mvvm-with-datatemplateselector-is-portable-from-silverlight-to-flex – user310291 2011-04-09 20:21:40

回答

2

我認爲這通常是在實踐中的情況。然而,將演示文件分解爲View和ViewModel的美妙之處在於,您可以輕鬆創建許多不同的Views,每個Views都顯示與Model基本相同的數據,全部共享相同的ViewModel類(可能或可能不是相同的實例 )。例如,我可以有一個簡單高級我的數據視圖,主要在XAML中編寫爲兩個完全不同的UserControl,它們共享相同的ViewModel(類或可能是實例)。如果不使用MVVM,那麼在沒有重複代碼的情況下這將會更加棘手。

+0

問題是可移植性然後http://stackoverflow.com/questions/5607619/how-mvvm-with-datatemplateselector-is-portable-from-silverlight-to-flex – user310291 2011-04-09 20:19:57

+0

可移植性問題如何與一個viewmodel的多個視圖相關? – 2011-04-09 20:29:53

+0

,因爲如果我想在多個平臺上執行多個視圖,並且使用ms mvvm不可移植,我無法使用它。 – user310291 2011-04-09 21:01:10

2

在MVVM中,您有一個View(presentation)和一個ViewModel(邏輯),它旨在支持演示需求。對於ViewModel,您可以輕鬆獲得多個視圖,而且通常會出現這種情況,主要是在您將多個DataTemplate對象(這是一個視圖)綁定到基於正在使用它的上下文的單個ViewModel類型的情況下。

雖然通常是有一個爲這些類型之一的映射,這不是一種限制一個公約和沒有「設計限制」在MVVM模式。

+0

如果必須使用DataTemplate選擇器來獲取多個視圖,它是如何約定的?這可能不是可移植的http://stackoverflow.com/questions/5607619/how-mvvm-with-datatemplateselector-is-portable-from-silverlight-to-flex – user310291 2011-04-09 20:19:29

+0

視圖到ViewModels的一對一映射是約定。您實施多對一映射的方式取決於您。 – 2011-04-09 20:24:34

1

正確。通常,視圖模型是專門爲一個視圖而設計的。它沒有關於視圖中使用的特定控件的任何知識,但它確實具有結構和功能知識。擁有多個視圖和一個視圖模型往往會使視圖模型類違反單一責任原則。

雖然有時它有意義,有幾個視圖和一個視圖模型。例如,相同視圖的基本和高級版本。在基本版本中,您只需隱藏一些零件或以簡單的功能以簡單的方式顯示信息。在這種情況下,對於這兩個視圖有一個視圖模型是絕對沒問題的,否則你將不得不復制大部分視圖模型的代碼。

MVVM模式不強制視圖和視圖模型之間的一對一關係,但在大多數情況下,它是推薦的方法。如果你希望對一個視圖模型有多個視圖,你應該在走這條路之前仔細考慮,因爲你最終可能會得到一個視圖模型,其中一半視圖模型使用一個視圖,另一個視圖模型使用另一個視圖模型。

2

我覺得這個沒有限制,完全取決於你的設計和要求。您可以爲單個ViewModel創建多個View來呈現不同的UI表示。

0

我實際上使用這個一對一的關係沒有在項目中強制執行的事實。

我們發出了警報vm,我們希望將它們顯示在我們的某個視圖的列表中,但還會在出現新警報時彈出通知並在主屏幕中執行此操作。 通過將彈出控件的數據上下文設置爲警報vm,我們可以輕鬆實現此功能。

相關問題