.NET MVVM設(shè)計(jì)模式簡(jiǎn)介
英文原文:Intro to the Model-View-ViewModel Design Pattern
MVVM 模式能夠幫你把你程序的業(yè)務(wù)與展現(xiàn)邏輯從用戶界面干凈地分離開。保持程序邏輯與界面分離能夠幫助解決很多開發(fā)以及設(shè)計(jì)問題,能夠使你的程序能更容易的測(cè)試,維護(hù)與升級(jí)。它也能很大程度的增加代碼重用性,并讓開發(fā)者與界面設(shè)計(jì)者更容易地相互合作。
使用 MVVM 模式,程序的 UI 和其背后的展現(xiàn)與業(yè)務(wù)邏輯將被分離至三個(gè)類中:
1-視圖,封裝 UI 與 UI 邏輯
2-模型視圖,封裝展示邏輯與狀態(tài)
3-模型,封裝程序的業(yè)務(wù)邏輯以及數(shù)據(jù)
MVVM 模式是展示-模型模式的變種,它優(yōu)化了一些 WPF 的核心特性,例如數(shù)據(jù)綁定,數(shù)據(jù)模版,命令以及行為。在 MVVM 模式中,視圖通過數(shù)據(jù)綁定以及命令行與視圖模型交互,并改變事件通知。視圖模型查詢觀察并協(xié)調(diào)模型更新,轉(zhuǎn)換,校驗(yàn)以及聚合數(shù)據(jù),從而在視圖顯示。
下圖展示了 MVVM 類以及它們之間的交互:
視圖類
視圖的責(zé)任便是定義用戶在屏幕上能看到的一切的結(jié)構(gòu)以及外觀。理想的視圖背后的代碼只包含調(diào)用 InitializeComponent 方法的構(gòu)造函數(shù)。視圖通常扮演以下關(guān)鍵角色:
- 視圖是可視化元素,例如窗口,頁(yè)面,用戶控件或者數(shù)據(jù)模版
- 視圖定義了包含在視圖里的控件以及可視化層以及樣式
- 視圖通過 DataContext 屬性應(yīng)用視圖模型
- 綁定了控件以及數(shù)據(jù)的屬性以及命令被視圖模型暴露出來
- 視圖可以定制化視圖與視圖模型間數(shù)據(jù)綁定行為
- 視圖定義以及處理 UI 可視化行為例如動(dòng)畫
- 視圖背后的代碼實(shí)現(xiàn)了用 XAML 很難表達(dá)的可視化行為
視圖模型類
視圖模型在 MVVM 模式中為視圖封裝了展示邏輯,它并不是直接引用視圖或者任何其他關(guān)于視圖特定的實(shí)現(xiàn)或者類型。視圖模型實(shí)現(xiàn)了屬性以及命令使得視圖進(jìn)行數(shù)據(jù)綁定,并通過改變事件通知來提醒視圖狀態(tài)已經(jīng)改變了。視圖模型提供的屬性和命令定義了提供給 UI 的功能。但是視圖定義了如何渲染的功能。
視圖模型負(fù)責(zé)協(xié)調(diào)視圖與任何需要的模型類的交互。很典型的,視圖模型與視圖類有著一堆多的關(guān)系。視圖模型可以選擇直接將模型類暴露給視圖,因此視圖的控件能夠直擊進(jìn)行數(shù)據(jù)綁定。視圖模型可以轉(zhuǎn)換或者操縱模型數(shù)據(jù)所以能夠很容易被視圖使用。
很典型的,視圖模型會(huì)定義能被展現(xiàn)在 UI 上并被用戶調(diào)用的的命令或者行為。一個(gè)通用的例子就是當(dāng)視圖模型需要提交命令時(shí)會(huì)允許用戶提交數(shù)據(jù)到網(wǎng)絡(luò)服務(wù)或者數(shù)據(jù)庫(kù)。視圖可以選擇用一個(gè)按鈕來展示所以用戶能夠點(diǎn)擊該按鈕提交數(shù)據(jù)。典型地,當(dāng)命令編程不可用的,它相關(guān)的 UI 展示也變得不可用。視圖模型通常扮演下面這些關(guān)鍵角色:
- 模型視圖是非可視化類,它封裝了展現(xiàn)邏輯
- 視圖模型是可以獨(dú)立于視圖與模型調(diào)試的
- 視圖模型很典型地是不直接引用視圖的
- 視圖模型實(shí)現(xiàn)了視圖用來數(shù)據(jù)綁定的屬性與命令
- 視圖模型通過改變提醒事件通知視圖狀態(tài)的改變:INotifyPropertyChanged 與 INotifyCollectionChanged
- 視圖模型協(xié)調(diào)視圖與模型的交互
- 視圖模型可以定義視圖展現(xiàn)給用戶的邏輯狀態(tài)
模型類
model 在 MVVM 模式中封裝了業(yè)務(wù)邏輯以及數(shù)據(jù),業(yè)務(wù)邏輯定義了像所有檢索和程序數(shù)據(jù)管理相關(guān)的程序邏輯一樣,用來確保所有的保證數(shù)據(jù)持久與有效的業(yè)務(wù)規(guī)則被應(yīng)用。***化代碼重用,模型不能包含任何特定的情況,特定的用戶任務(wù)以及程序邏輯。
典型的有模型為程序展現(xiàn)了客戶端域模型,模型也可能包含支持?jǐn)?shù)據(jù)訪問與緩存的代碼,即使有一個(gè)分離的數(shù)據(jù)庫(kù)或者服務(wù)被使用。模型與數(shù)據(jù)房分層通常被作為數(shù)據(jù)訪問或嗚嗚結(jié)構(gòu)而生成,例如 ADO.NET 尸體礦井唉,WCF 數(shù)據(jù)服務(wù),或者 WCF RIA 服務(wù)。
模型層實(shí)現(xiàn)了輕松綁定視圖的功能。這通常意味著它支持通過 INotifyPropertyChanged 與 INotifyCollectionChanged 進(jìn)行屬性與集合更改通告。展現(xiàn)對(duì)象集合的模型類典型地源自 ObservableCollection<T>類,該類提供了對(duì) INotifyCollectionChanged 接口的實(shí)現(xiàn)。
模型也能通過 IDataErrorInfo 接口支持?jǐn)?shù)據(jù)驗(yàn)證以及錯(cuò)誤報(bào)告。這些接口允許當(dāng)數(shù)值改變時(shí)的 WPF 數(shù)據(jù)綁定被通知,從而更新界面。模型通常扮演如下的關(guān)鍵角色:
- 模型類是不可視類,它封裝了程序數(shù)據(jù)
- 模型類不直接應(yīng)用視圖或視圖模型類
- 模型類不依賴于它們是如何實(shí)現(xiàn)的
- 模型類是典型地通過 INotifyPropertyChanged/INotifyCollectionChanged 接口提供屬性與集合更改事件的.
- 模型類很典型地繼承自 ObservableCollection<T> 類
- 模型類是很典型地通過 IDataErrorInfo/INotifyDataErrorInfo.提供數(shù)據(jù)驗(yàn)證與錯(cuò)誤報(bào)告
- 模型類典型地與封裝了數(shù)據(jù)訪問的服務(wù)一起使用。
原文來自:http://www.oschina.net/question/89964_46543
【編輯推薦】