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