2009-06-17 30 views
2

Over StackOverflow問題How can WPF Converters be used in an MVVM pattern?我知道值轉換器不應該用在MVVM模式中,因爲值轉換器的功能應該由ViewModel本身處理。您的ViewModel應該將XAML元素作爲屬性公開嗎?

這是有道理的。

但我記得讀過你應該不會將XAML元素暴露給視圖,而是隻顯示View然後使用DataTemplates綁定和顯示的數據集合。

然而,轉換器似乎相當強大(例如,因爲它們是在MVVM Template demo使用,請參閱「信使示例」拆包之後)在他們可以將對象轉換爲對象,例如消息對象到FlowDocument對象,或客戶對象到可見性對象,或自定義狀態對象到圖像等

所以,如果一個ViewModel去承擔價值轉換器的功能,它將不得不公開XAML元素和屬性,如StackPanel,Visibility,Color,FlowDocument等等,對嗎?

有誰看到任何理由的價值轉換器做一個視圖模型不應該公開這些豐富的XAML對象?

回答

10

因爲然後限制視圖模型僅與特定的視覺表示一起使用。 當ViewModel發佈XAML時,它將設計內容放入開發人員的域中。 這意味着使用Expression Blend的設計師不能編輯設計資產 - 而設計師/開發人員工作流程被打破。 將XAML保留在頁面上,並將值轉換器與數據模板一起使設計與代碼分離。

當您的視圖模型公開具體的XAML這也限制了視圖模型只在特定的情況下使用,使得它不太重用。

1

我覺得MVVM/MVC/MVP等等的一個想法是GUI代碼隔離到一個文件/類。 如果你這樣做,你可以改變其他一些用戶界面,而無需重寫其他對象? 我想如果你傳遞WPF特定對象的答案是否定的。 這是一個價值判斷,你必須爲自己做出。

4

不要忘記,你可以使用的DataTemplates了。我可以看到保持ValueConverters不受MVVM的影響,但DataTemplates都是關於將對象轉換爲GUI的。

您的ViewModel可以將其他對象(例如嵌套的ViewModel)暴露給GUI,並且GUI可以使用<DataTemplate DataType="{x:Type SubViewModel}">...將這些對象映射到GUI。

3

有沒有人看到任何理由爲什麼ViewModel不應該公開這些豐富的XAML對象值轉換器呢?

絕對的,因爲它破壞MVVM的所有目標:

  1. 你不再是單元測試,至少不容易。
  2. 邏輯(視圖模型)和表示(視圖)之間不再分離。因此,設計人員和開發人員不能輕鬆協作。
  3. 代碼維護比較困難,因爲您已將問題混合在一起。

如果我看到一個視圖模型返回視圖,我甚至不會將它歸類爲MVVM。

-1

沒有絕對的100%規則適用於這個或許多其他概念,當你在討論它們時沒有考慮到社區的思維爲什麼會朝這個方向轉變的原因。 「傳統智慧」中不存在「假設的」真理或科學,無論當時有多麼新或令人信服。

換句話說 - 只要你的團隊盡力做到最好,你已經在人類的關注中獲得了比任何真實的更多的東西。

相關問題