實例解析
WPF的數據綁定與Presentation Model相結合是非常好的做法,使得開發人員可以將
View和邏輯分離出來,但這種數據綁定技術非常簡單實用,也是WPF所特有的,所以我們又稱之為Model-View-ViewModel(MVVM)。這種模式跟經典的MVP(Model-View-Presenter)模式很相似,除了你需要一個為View量身定製的model,這個model就是ViewModel。ViewModel包含所有由UI特定的接口和屬性,並由一個 ViewModel 的視圖的綁定屬性,並可獲得二者之間的鬆散耦合,所以需要在ViewModel 直接更新視圖中編寫相應代碼。數據綁定系統還支持提供了標準化的方式傳輸到視圖的驗證錯誤的輸入的驗證。
在視圖(View)部分,通常也就是一個Aspx頁面。在以前設計模式中由於沒有清晰的職責劃分,UI 層經常成為邏輯層的全能代理,而後者實際上屬於應用程式的其他層。MVP 里的M 其實和MVC里的M是一個,都是封裝了核心數據、邏輯和功能的計算關係的模型,而V是視圖(窗體),P就是封裝了窗體中的所有操作、回響用戶的輸入輸出、事件等,與MVC里的C差不多,區別是MVC是系統級架構的,而MVP是用在某個特定頁面上的,也就是說MVP的靈活性要遠遠大於MVC,實現起來也極為簡單。
我們再從IView這個interface層來解析,它可以幫助我們把各類UI與邏輯層解耦,同時可以從UI層進入自動化測試(Unit/Automatic Test)並提供了入口,在以前可以由WinForm/Web Form/MFC等編寫的UI是通過事件Windows訊息與IView層溝通的。WPF與IView層的溝通,最佳的手段是使用Binding,當然,也可以使用事件;Presenter層要實現IView,多態機制可以保證運行時UI層顯示恰當的數據。比如Binding,在程式中,你可能看到Binding的Source是某個interface類型的變數,實際上,這個interface變數引用著的對象才是真正的數據源。
MVC模式大家都已經非常熟悉了,在這裡我就不贅述,這些模式也是依次進化而形成MVC—>MVP—>MVVM。有一句話說的好:當物體受到接力的時候,凡是有界面的地方就是最容易被撕下來的地方。因此,IView作為公共視圖接口約束(契約)的一層意思;View則能傳達解耦的一層意思。
MVVM控制項
使用MVVM來開發用戶控制項 。由於用戶控制項在大部分情況下不涉及到數據的持久化,所以如果將M純粹理解為DomainModel的話,使用MVVM模式來進行自定義 控制項開發實際上可以省略掉M,變成了VVM。