在WP開發(fā)中如何使用MVVM Light框架
MVVM Light是Silverlight開發(fā)中比較流行的MVVM框架。本文作者將根據(jù)一個實(shí)際項(xiàng)目(Windows Phone程序),為大家介紹MVVM Light的使用說明。
MVVM Light相關(guān)資源
項(xiàng)目地址:http://mvvmlight.codeplex.com/releases
MVVM Light介紹
首先貼一張圖,這是MVVM的一個內(nèi)部通信機(jī)制。
簡單的概括來說MVVM Light幫我實(shí)現(xiàn)了View和ViewModel的相互通信,ViewModel和Model的通信。
為什么使用MVVM Light
◆比較方便做單元測試;
◆不需要改變Model來支持不同的View變化;
◆在View發(fā)生變化時,只需要對ViewModel做極小的改變就可以適應(yīng)新的程序,很方便程序的移植;
◆將設(shè)計(jì)UE和開發(fā)分離,開發(fā)人員只負(fù)責(zé)底層通信的實(shí)現(xiàn),做界面的人員只需盡可能的去美化UI,我們團(tuán)隊(duì)中將ViewModel也是交給界面設(shè)計(jì)人員來做,我覺得ViewModel究竟由UE還是由開發(fā)來做還是值得商榷的,因該根據(jù)具體團(tuán)隊(duì)分工來說。
MVVM Light使用
如果你打開我上面說的鏈接地址的話,你會安裝MVVM Light的.msi文件,安裝成功后,打開VS2010,選擇新建項(xiàng)目,會看到如下界面:
新建好一個MVVM項(xiàng)目,你會在右邊看到一個如下的項(xiàng)目樹,他們中分別有對應(yīng)我們需要使用的View,ViewModel,Model,我個人習(xí)慣一個View對應(yīng)一個ViewModel,當(dāng)然如果Model有復(fù)用的情況,就可以多個ViewModel對應(yīng)一個Model,所以Model的數(shù)量是根據(jù)個人情況可以改變的,有的人還習(xí)慣將Model放入ViewModel中,但是既然MVVM Light已經(jīng)給我們將文件樹的框架列出來了,我想也有他的道理。
再說說那個ViewModelLocator文件,他是整個項(xiàng)目的核心文件,打個比方來說就好比人脊梁,支撐著我們的四肢。在他當(dāng)中我們對每一個ViewModel進(jìn)做了實(shí)例化,而在他的構(gòu)造函數(shù)中使用了一個Singleton設(shè)計(jì)模式,從而保證,在整個項(xiàng)目運(yùn)行過程中,只存在一個ViewModelLocator實(shí)例,不過我發(fā)現(xiàn)這個Singleton并沒有對多線程做支持,也就是說如果你做的是多線程程序,這里需要改成支持多線程的Singleton,具體我在之前的博文中有介紹Singleton。
介紹完了各個文件的作用,就來說說具體用法,在這里我不想一步一步寫出來每一行代碼的用法,因?yàn)楦杏X浪費(fèi)時間,而且有些重復(fù)很多網(wǎng)友的勞動,我只將一些比較關(guān)鍵的代碼貼出來,希望對你起到觸類旁通的作用。
首先打開App.xaml文件,你會看到如下代碼,如果沒有請自己添上,因?yàn)锳pp文件是一個全局變量,并且在程序最開始啟動就已經(jīng)運(yùn)行了,這里的代碼是告訴編譯器在程序一開始就去訪問ViewModelLocator文件,并且構(gòu)造一個全局可以訪問的ViewModelLocator實(shí)例,x:key是用于xaml文件訪問的,d:IsDataSource是用于ExpressionBlend構(gòu)建界面時來實(shí)時顯示數(shù)據(jù)用的。
既然有了全局的ViewModelLocator,那么就可以在View中去構(gòu)建Command與ViewModel中的Command進(jìn)行綁定,從而實(shí)現(xiàn)View和ViewModel的通信,下面是在View當(dāng)中兩種調(diào)用Command的方式:
上面兩個調(diào)用方式效果是完全一樣的,我懷疑上面那種方式是下面的一種封裝,因?yàn)閏md是可以用在Button類控件當(dāng)中的,而下面的則不行,當(dāng)然除了簡簡單單的綁定Command外,也可以傳遞CommandParameter參數(shù),而且還有支持手勢的Command,因?yàn)楸疚牟]有想去討論的這么深入,所以就不多深入介紹,如果你有興趣,可以通過右側(cè)微博或是在博客里留言等方式找到我。
下面是在ViewModel中去實(shí)現(xiàn)上面所要用到的Command。
除了Command外,相信MVVMLight給我?guī)淼木褪荕essager這個東西了,他一般被使用在code-behind當(dāng)中,使用方式如下:
在ViewModel中響應(yīng)該Messenger的代碼在之前介紹ViewModel的Command中已經(jīng)有出現(xiàn),可以看看那里注釋掉的代碼,在這里需要注意的是在OnNavigationTo方法注冊了Messenger之后在OnNavigationFrom中一定要進(jìn)行卸載,否則會造成內(nèi)存泄漏。
原文鏈接:http://tmango.com/?p=878