介紹
MVVM的出現給WPF Silverlight程序定義了程序的框架,MVVM可以解決業務層和UI層的耦合問題,更多優點不再贅述。
在WP手機端,很多工程也都采用MVVM進行架構,比較常見的工具集是MVVM Light Toolkit 。它被應用在很多已知WP項目中,也有一些自己實現的MVVM架構工具多數也都基於此。而我們今天要說的是Caliburn Micro這個用於MVVM架構的Framework。
首先對比下MVVM Light Toolkit 和Caliburn Micro:
|
MVVM Light |
Caliburn Micro |
View和ViewModel之間的通信 |
事件:通過EventToCommand將View中的事件通過ICommand接口 Binding到ViewModel中定義的Command上 屬性:Binding 到ViewModel中對應屬性 |
事件:通過Action直接關聯View中的事件到ViewModel里的方法中無需在ViewModel中定義Command
屬性:根據命名協定自動Binding |
View和ViewModel之間如何Binding |
View 中綁定DataContext到 ViewModelLocator中的ViewModel |
根據命名協定(Conventions)自動找到View對應的ViewModel然后進行自動綁定 |
ViewModel之間如何通信 |
提供Messenger進行通信 |
提供EventAggregator進行通信 |
ViewModel中執行導航 |
自定義NavigationService |
根據命名協定通過ViewModel找到View然后執行導航 |
優點 |
概念簡單清晰,容易理解 |
自動完成許多工作,大大降低開發人員編碼量 |
不足 |
相比Caliburn Mirco實現相同邏輯需要的代碼量更多 |
學習成本較高,許多概念初次接觸不容易掌握 |
兩者孰優孰劣不做過多分析,個人觀點,雖然CM學習成本較高,但其提供了更多方便開發的功能,是團隊的好選擇。
從Hello World開始
讓我們先從最簡單的程序開始看下CM 框架的基本使用
我們新建好WP8程序后在References里面可通過Nuget來添加Caliburn Micro:
接下來我們要做的是將App.xaml.cs內的東西移除(沒錯,是移除,后面會詳細介紹)之后App.xaml.cs看起來是這個樣子
之后我們在根目錄下定義一個類,名字隨意比如Bootstrapper之后添加如下內容:
using System.Collections.Generic; using Caliburn.Micro; using CaliburnPractise.ViewModels; namespace CaliburnPractise { public class Bootstrapper:PhoneBootstrapper { private PhoneContainer _phoneContainer; protected override void Configure() { _phoneContainer = new PhoneContainer(RootFrame); _phoneContainer.RegisterPhoneServices(); } protected override object GetInstance(System.Type service, string key) { return _phoneContainer.GetInstance(service, key); } protected override IEnumerable<object> GetAllInstances(System.Type service) { return _phoneContainer.GetAllInstances(service); }
protected override void BuildUp(object instance) { _phoneContainer.BuildUp(instance); }
} }
分析:CM使用PhoneContainer作為容器來提供事例(此處涉及Dependency Inject以及Container的概念具體情況不在贅述,若不很清楚可查閱相關資料,在此不進行過多的解釋)
之前我們將App.xaml.cs中文件刪除是因為PhoneBootstrapper對其進行了包裝,PhoneBootstrapper內部對這些事件進行了接管。
接下來我們需要在App.xaml中進行Bootstrapper的定義。
如此Bootstrapper添加完畢。
接下來我們在根目錄下添加MainPageViewModel並在其中定義
在MainPage.xaml中添加Textblock 並起名為Title
在Bootstrapper的Configure中加入下面代碼
然后我們運行程序,便會看到神奇的事情,程序打開之后UI中的Title自動Binding了。
CM自動完成了兩件事情:
1、根據命名協定自動對MainPage進行了DataContext的Binding,通過PhoneContainer找到
對應的MainPage然后Auto Binding
2、根據命名協定找到了ViewModel中名字為Title的屬性,並自動Binding到Textbox的Text上。
接下來我們在MainPageViewModel中添加一個函數試試:
在View中加一個按鈕名字叫做SayHello:
之后運行,點擊這個按鈕,又是神奇的一幕,MessageBox彈出,SayHello被執行。
分析:
通過上面的例子我們可以看到,程序將UI代碼和邏輯代碼分開,而且我們並沒有很多繁瑣的工作,這些歸功與CM內部命名協定機制,進行自動Binding幫助我們完成工作。很強大不是么?
通過上面的小例子我們可以看出CM的優勢和它的厲害之處,在后續文章中我會對其中的內容進行深入的分析。
先提供一些地址供大家學習:
官方文檔:caliburnmicro.codeplex.com/documentation
系列博客:wp.qmatteoq.com/first-steps-with-caliburn-micro-in-windows-phone-8-the-first-project/
QQ交流群:182659848 歡迎加入進來一起探討。