2009-10-29 104 views
31

爲什麼我們在處理WPF時使用MVVM或MVP?爲什麼MVVM以及它的核心優勢是什麼?

通過使用它可以帶來什麼額外好處?

編輯:

說實話,今天我有一個採訪,我一直在問這個問題。我回答像INotifyPropertyChanged,ICommand,IValue轉換器..但他不滿意。從此以後我都忍了這個問題

在此先感謝

+3

我總是看着MVVM作爲MVC的變體。 – 2009-10-29 16:38:58

回答

44

我會告訴你一個Jason Dolinger特別有用的video。從一個WinForms世界開始,實現任何MVX風格的模式似乎比它的價值更加麻煩,但是在使用WPF幾年後,我可以誠實地說我不會考慮更少的東西。整個範例都支持開箱即用。

首先,關鍵的好處是能夠實現'視圖'和'模型'之間的真正分離。這實際上意味着,如果/當你的模型需要改變時,它可以不需要視圖,反之亦然。其次,雖然你的'模型'可能包含你在'視圖'中可能需要的所有數據,但是你可能想要以'模型'不支持的方式來抽象這些數據。例如,假設你的模型包含一個日期屬性。在該模型中,它可以僅作爲DateTime對象存在,但您的視圖可能想要以完全不同的方式呈現它。如果沒有'viewmodel',你必須複製'model'中的屬性來支持視圖或修改可能嚴重混淆'model'的屬性。

您還可以使用'viewmodel'來聚合存在於單獨的類/庫中的模型的某些部分,以便爲'視圖'處理更流暢的界面。它很可能是非常您不希望您的代碼中的數據與用戶希望或希望將數據呈現給他們一樣。

最重要的是,您將獲得對'view'和'viewmodel'之間自動雙向數據綁定的支持。

真的有額外的東西一大堆,我可以喋喋不休,但傑森說的這更好,我可以讓我的建議是,觀看視頻。經過幾天這樣的工作,你會想知道如果沒有它,你會怎樣。

祝你好運。

+5

傑森的視頻絕對是我見過/讀過的MVVM的最佳介紹。源代碼可以在這裏找到http://blog.lab49.com/archives/2689 – 2011-10-19 03:45:11

3

烤在ICommand的和INotifyPropertyChanged的支持是兩個最大的好處。使用MVVM可以很容易地連接命令並將數據插入WPF UI。事情正常。

+0

說實話,今天我接受了一次採訪,我被問到了這個問題。我也回答幾乎像INotifyPropertyChanged,ICommand,IValue轉換器一樣的東西..但他不滿意。從此我提出了這個問題。 – 2009-10-29 15:21:21

5

WPF比任何其他UI框架,這MVVM將不羈沒有

MVVM提供單元可測試性和良好的視野,不可知論,這使得它使用

15

這些是我的具體一件好事更好的數據綁定到MVVM

  1. 增加了 「可混合性」 的你的意見(能夠使用Expression Blend的設計視圖)。這樣可以讓有足夠幸運的設計師和程序員的團隊分擔責任......每個人都可以獨立工作。
  2. 「Lookless」查看邏輯。視圖與運行在其後面的代碼無關,使相同的視圖邏輯可以在多個視圖中重用,或者可以輕鬆地重新構造或替換視圖。分解「行爲」和「風格」之間的關係。
  3. 沒有重複的代碼來更新視圖。在代碼隱藏中,您會看到很多調用「myLabel.Text = newValue」的地方。使用MVVM,您可以放心,只需設置底層屬性及其所有視圖副作用即可更新視圖。
  4. 可測性。由於你的邏輯完全不可知你的視圖(沒有「myLabel.Text」引用),單元測試變得非常簡單。您可以測試ViewModel的行爲而不涉及其視圖。這也使視圖行爲的測試驅動開發成爲可能,使用後臺代碼幾乎是不可能的。

其他兩種模式在他們所關注的問題上實際上是分開的。你可以使用MVVM和MVP(MVC和MVC中最好的示例)。實際上,在我看來,MVP(w/a被動視圖,而不是監督控制器)實際上只是MVVM的一個變體。

+2

2和4對於MVC或MVP以及MVVM都是正確的。 – 2009-10-29 16:21:33

+0

是的......我忽略了這些模式,因爲它們確實解決了典型應用程序的一個稍微不同的方面。我編輯了我的答案以包含此內容。 – 2009-10-29 16:23:52

+0

+1不錯和容易理解 – 2013-12-24 12:27:31

0

XAML代碼綁定數據的能力以及觸發器的存在將打破MVP和MVC模式。

1

我個人認爲MVVM不是好處,而是希望使用WPF酷功能的人的義務。

WPF在內核中使用數據綁定構建的程度非常高,可以將UI從模型中分離出來。但是,數據綁定在WPF是技術上做的方式有點特殊,因爲它綁類,如:

  • 的DependencyProperty
  • 因此INotifyPropertyChanged的
  • 的ObservableCollection

你只是不能真正使用標準.NET技術按照您的方式編寫模型。例如,WPF TreeView幾乎不可能使用數據綁定和模板使用w/o。例如,您無法像使用Winforms中的通用模型那樣填充它。它使用ObservableCollection將必須綁定到分層模型以表示節點的子節點。假設V表示XAML代碼,它是代碼隱藏的對象(所以它與WPF作爲一項技術綁定在一起),假設M代表您的模型(因此它不依賴於WPF UI技術)。

好吧,你永遠不會有這個工作正常WPF下,只有這些V & M.

必須添加兩個之間的事情。一些WPF兼容並理解你的模型。說的是DependencyProperty,ObservableCollection和INotifyPropertyChanged。這就是所謂的虛擬機。作爲一個方面說明,MVVM的另一種選擇是構建一個M(W/O VM管道)組合,其中M是WPF兼容的,但仍具有合理的UI獨立性。從歷史上看,ObservableCollection位於WindowsBase.dll程序集(隨WPF一起提供)中,因此將一個通用模型綁定到與UI技術綁定的東西看起來很奇怪。因爲它已經被移回到System.dll。即使那樣,有時很難保持一個純虛擬機模型沒有調整M專門爲WPF ...

+0

是同意你說的大部分內容,但是WPF的數據綁定在代碼背後以及虛擬機方面都很出色。 OC,INPC和DP在沒有MVVM的情況下工作得很好。 WPF的真正威力在於數據綁定而不是MVVM。我們建立了MVVM和代碼,兩者都具有出色的數據綁定。 – 2017-07-27 12:56:25

相關問題