MVVM 模式能夠幫你把你程序的業務與展現邏輯從用戶界面干淨地分離開保持程序邏輯與界面分離能夠幫助解決很多開發以及設計問題能夠使你的程序能更容易的測試維護與升級它也能很大程度的增加代碼重用性並讓開發者與界面設計者更容易地相互合作
使用 MVVM 模式程序的 UI 和其背後的展現與業務邏輯將被分離至三個類中
視圖封裝 UI 與 UI 邏輯
模型視圖封裝展示邏輯與狀態
模型封裝程序的業務邏輯以及數據
MVVM 模式是展示模型模式的變種它優化了一些 WPF 的核心特性例如數據綁定數據模版命令以及行為在 MVVM 模式中視圖通過數據綁定以及命令行與視圖模型交互並改變事件通知視圖模型查詢觀察並協調模型更新轉換校驗以及聚合數據從而在視圖顯示
下圖展示了 MVVM 類以及它們之間的交互
視圖類
視圖的責任便是定義用戶在屏幕上能看到的一切的結構以及外觀理想的視圖背後的代碼只包含調用 InitializeComponent 方法的構造函數視圖通常扮演以下關鍵角色
視圖是可視化元素例如窗口頁面用戶控件或者數據模版
視圖定義了包含在視圖裡的控件以及可視化層以及樣式
視圖通過 DataContext 屬性應用視圖模型
綁定了控件以及數據的屬性以及命令被視圖模型暴露出來
視圖可以定制化視圖與視圖模型間數據綁定行為
視圖定義以及處理 UI 可視化行為例如動畫
視圖背後的代碼實現了用 XAML 很難表達的可視化行為
視圖模型類
視圖模型在 MVVM 模式中為視圖封裝了展示邏輯它並不是直接引用視圖或者任何其他關於視圖特定的實現或者類型視圖模型實現了屬性以及命令使得視圖進行數據綁定並通過改變事件通知來提醒視圖狀態已經改變了視圖模型提供的屬性和命令定義了提供給 UI 的功能但是視圖定義了如何渲染的功能
視圖模型負責協調視圖與任何需要的模型類的交互很典型的視圖模型與視圖類有著一堆多的關系視圖模型可以選擇直接將模型類暴露給視圖因此視圖的控件能夠直擊進行數據綁定視圖模型可以轉換或者操縱模型數據所以能夠很容易被視圖使用
很典型的視圖模型會定義能被展現在 UI 上並被用戶調用的的命令或者行為一個通用的例子就是當視圖模型需要提交命令時會允許用戶提交數據到網絡服務或者數據庫視圖可以選擇用一個按鈕來展示所以用戶能夠點擊該按鈕提交數據典型地當命令編程不可用的它相關的 UI 展示也變得不可用視圖模型通常扮演下面這些關鍵角色
模型視圖是非可視化類它封裝了展現邏輯
視圖模型是可以獨立於視圖與模型調試的
視圖模型很典型地是不直接引用視圖的
視圖模型實現了視圖用來數據綁定的屬性與命令
視圖模型通過改變提醒事件通知視圖狀態的改變INotifyPropertyChanged 與 INotifyCollectionChanged
視圖模型協調視圖與模型的交互
視圖模型可以定義視圖展現給用戶的邏輯狀態
模型類
model 在 MVVM 模式中封裝了業務邏輯以及數據業務邏輯定義了像所有檢索和程序數據管理相關的程序邏輯一樣用來確保所有的保證數據持久與有效的業務規則被應用最大化代碼重用模型不能包含任何特定的情況特定的用戶任務以及程序邏輯
典型的有模型為程序展現了客戶端域模型模型也可能包含支持數據訪問與緩存的代碼即使有一個分離的數據庫或者服務被使用模型與數據房分層通常被作為數據訪問或嗚嗚結構而生成例如 ADONET 屍體礦井唉WCF 數據服務或者 WCF RIA 服務
模型層實現了輕松綁定視圖的功能這通常意味著它支持通過 INotifyPropertyChanged 與 INotifyCollectionChanged 進行屬性與集合更改通告展現對象集合的模型類典型地源自 ObservableCollection<T>類該類提供了對 INotifyCollectionChanged 接口的實現
模型也能通過 IDataErrorInfo 接口支持數據驗證以及錯誤報告這些接口允許當數值改變時的 WPF 數據綁定被通知從而更新界面模型通常扮演如下的關鍵角色
模型類是不可視類它封裝了程序數據
模型類不直接應用視圖或視圖模型類
模型類不依賴於它們是如何實現的
模型類是典型地通過 INotifyPropertyChanged/INotifyCollectionChanged 接口提供屬性與集合更改事件的
模型類很典型地繼承自 ObservableCollection<T> 類
模型類是很典型地通過 IDataErrorInfo/INotifyDataErrorInfo提供數據驗證與錯誤報告
模型類典型地與封裝了數據訪問的服務一起使用
From:http://tw.wingwit.com/Article/program/net/201311/12389.html