基於wpf的相關設計問題-ViewModel
prism v2正式版本已經發布,有興趣的可以去研究一下.框架給了我們一些實用的功能參考,並不代表實際開發就不會遇到問題。有些人以為只要套用了框架,開發效率就會提升很好,就好比有人以為只要我掌握了設計模式,開發效率會提升一樣。框架只是為我們解決一部分常用的問題.但對於不同系統的設計總有些不同.本篇將討論在wpf中主要使用了一些設計方法.
一.Model-View-Presenter
MVP模式現已經非常常用,如果你不熟悉請參考此文MVP 模式例項解析,我把我自己理解的相關類列出來.
我來介紹一下流程(下為部落格園登入介面)
1.抽象View成員 LoginView是一個UserControl,將介面上的屬性抽象出來,定義成一個ILoginView介面.
2.在LoginView初始化時,同時初始化LoginViewPresenter,可呼叫Initialize方法做一些初始化工作(這裡可知道,View是知道LoginViewPresenter存在的,同時LoginViewPresenter又可以呼叫LoginView的相關屬性和方法).
3.當觸發登入事件時,LoginViewPresenter將會呼叫ValidateLogin方法來驗證View的UserName和Password.
4.ValidateLogin方法將會牽涉到資料庫的一些操作,所以把這部分的操作分離到Controller中(即Service).
5.驗證完成後再通知LoginView的驗證結果以便更新介面資訊.
以上為基本的步驟,實際操作起來並非簡單,重點在於如何把職責分明確,同時使用此模式也希望能更加的簡便.
MVP模式與asp.net
上面的應用假設是應用於web系統,則依賴於asp.net的WebForms(WebForms很適合這樣的操作),實際中卻不現實,asp.net mvc模式相對而言就比較容易,其做了相對多的封裝.WebForms則模擬的web的無狀態,MVP會依賴於asp.net控制元件,使得開發者無法認識web的本質(html,css,javascript), 陷入模式中無法自拔.所以我個人並不是非常推薦,當然還是要看具體場合.
以上簡單介紹了MVP模式的基本應用,等下我們來看一下其在wpf中的應用.
二.Presentation Model
1.Model與View的演變
在上面MVP模式,我們並沒有說到Model,Model是什麼?
ILoginView檢視中的兩個屬性是我們需要的屬性,檢視是最容易發生變化的地方,隨著檢視的電話,IView和Presenter也要跟著發生變化,如,這裡我把UserName更改為FirstName和LastName拼成一個UserName.現在我把這些屬性單獨提取出來,現在變更如下.
這裡的Model是根據特定View而定的,所以也會隨著View的變化而發生變化.這個Model被稱為Presentation Model
傳統的MVC中的Model一般指資料層的物件,兩者是不同的.
以上的變化在很多情況下也是不確定的,因為隨著View的變化,View可以做出一些封裝(如封裝FirstName和LastName兩個欄位,View的做法有很多)讓Model不發生變化,由於檢視存著一些不確定因素,比如技術問題,就不得退而求其次,改Model.這個問題是確實存在的.
三.基於技術的基礎上變更模式Model-View-ViewModel (MVVM)
以上的變更,並非毫無意義,很多模式都是因為框架提供一些特定的技術而演變出來的,這裡也不例外的.資料繫結技術在.net中應用的非常廣泛。asp.net,winfrom和wpf均有資料繫結技術,檢視是沒有方法的,只由控制元件組成,我們就是要抽取這些控制元件的屬性而定義這個Model,然後將控制元件的屬性與Model屬性繫結起來,以便檢視和Model雙方發生變化時能相互通知(繫結比賦值更簡單,更容易讓人接受,簡化了工作)
下圖表示了View與Model之間的關係,兩者的變化是雙向繫結的.
如果你開發過wpf或者silverlight程式,相信你已經領略過其資料繫結的強大之處,這樣的做法用在wpf技術上,恰到好處.
模式只是一種想法,需要通過技術來實現(就如很多人知道mvc模式一樣,但並非每個人都能做出像asp.net mvc這樣的框架的),wpf的資料繫結與Presentation Model相集合是非常好的做法,使得開發人員可以將View和邏輯分離出來,但這種資料繫結技術(簡單實用)是wpf特有的,所以我們又稱之為Model-View-ViewModel (MVVM),很多人搞不清楚MVVM與Presentation Model的區別,其實脫離了技術,兩者毫無區別,我們可以理解為基於wpf的資料繫結技術的Presentation Model稱之為為Model-View-ViewModel (MVVM),這也是我個人的理解,如有不同意見或我理解錯誤請下面提出來.