Caliburn.Micro - Xaml made easy.
web: https://github.com/Caliburn-Micro/Caliburn.Micro
document: http://caliburnmicro.com/documentation/
nuget: Install-Package Caliburn.Micro
用於建立各個XAML平台應用,如WPF,Silverlight,WP,支持MV*模式
更多相關項目,請訪問代碼沉淀目錄
重要提示:請注意項目的版本,以官方最新版本為准。
在之前很早的博文中,我大體上翻譯了一個系列的文章,只不過由於CM框架更新太快,再加上一個主要原因,自己翻譯文章太慢,一個一個單詞查,所以只翻譯了一大半,不過也足夠大家使用了。這一篇文章介紹的是V2和V3版本的稍微會新一些。不過新版本和舊版本主要用法差不多,請看下方的官方示范。
Basic Configuration, Actions and Conventions
1. 啟動Visual Studio,新建一個解決方案 “Caliburn.Micro.Hello”,使用nuget方式(推薦),或者手動引用dll的方式,添加CM框架的類庫和System.Windows.Interactivity.dll。
刪除“MainPage.xaml”,修改 “App.xaml.cs” ,如下方所示:
namespace Caliburn.Micro.Hello { using System.Windows; public partial class App : Application { public App() { InitializeComponent(); } } }
2. CM框架更推薦使用View-Model-First方式,我們也這么干,創建第一個VM,名叫“ShellViewModel”,代碼如下:
namespace Caliburn.Micro.Hello { using System.Windows; public class ShellViewModel : PropertyChangedBase { string name; public string Name { get { return name; } set { name = value; NotifyOfPropertyChange(() => Name); NotifyOfPropertyChange(() => CanSayHello); } } public bool CanSayHello { get { return !string.IsNullOrWhiteSpace(Name); } } public void SayHello() { MessageBox.Show(string.Format("Hello {0}!", Name)); //Don't do this in real life :) } } }
可以看到,ShellViewModel 繼承自 PropertyChangedBase,這個基類簡單的定義了屬性通知,可實現簡單的通知界面更新功能。
3. 有了簡單的VM,下面我們就定義一下 bootstrapper,建立一個新類“HelloBootstrapper”,代碼如下:
namespace Caliburn.Micro.Hello { public class HelloBootstrapper : BootstrapperBase { public HelloBootstrapper() { Initialize(); } protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewFor<ShellViewModel>(); } } }
這個 Bootsrapper 通過調用一個方法,定義了一個 “頂級ViewModel”。在程序啟動時,CM框架在初始化時,就會加載這個頂級VM,並顯示這個VM對應的View。
Bootsrapper 在一些常見的mvvm框架中,可以看做是配置入口,比如配置設置,配置注入容器,等等。
4. 下一步,我們用 HelloBootstrapper 替換默認的程序啟動方式,修改 “App.xaml”,如下所示:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Caliburn.Micro.Hello" x:Class="Caliburn.Micro.Hello.App"> <Application.Resources> <local:HelloBootstrapper x:Key="bootstrapper" /> </Application.Resources> </Application>
WPF:
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Caliburn.Micro.Hello" x:Class="Caliburn.Micro.Hello.App"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary> <local:HelloBootstrapper x:Key="bootstrapper" /> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
這里,我們為 App 添加了一個資源,資源名為“bootstrapper”,需要提醒的是,此處已經刪除了 “Application.StartupUri” 屬性的值,不需要通過默認方式啟動窗體,改為通過CM框架的bootstrapper方式啟動前面配置的那個 “頂級ViewModel”。
接下來,你可以嘗試啟動你的程序,會看到界面中有如下字樣。
Caliburn.Micro.Hello.ShellView not found.
Caliburn.Micro 已經建立了一個 ShellViewModel,但是它還不知道如何顯示,所以,我們需要一個對應的 View,接下來我們創建一個用戶控件(User Control),名叫 “ShellView”,xaml代碼如下:
<UserControl x:Class="Caliburn.Micro.Hello.ShellView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel> <TextBox x:Name="Name" /> <Button x:Name="SayHello" Content="Click Me" /> </StackPanel> </UserControl>
再次啟動你的程序,這次你就能看到剛剛定義的UI界面了。
嘗試在TextBox內輸入文字,當Button可用時,點擊它,可以看到彈出了一個消息窗。
CM框架定義了一套簡潔有效的 “命名約定” 功能,用於匹配 View 和 ViewModel 之間的聯系。
其實,它就是獲取到指定 VM 的全名,並移除了 “Model” 部分,剩下的部分便是對應的 View 了。
比如,對 “MyApp.ViewModels.MyViewModel” 來說,就會得到 “MyApp.Views.MyView”。
對比一下 View 和 ViewModel,能發現,View中有一個 TextBox 控件,【x:Name=”Name”】 部分,實現了綁定到ViewModel中的 “Name” 屬性。還能發現,View中有一個 Button 控件,【x:Name=”SayHello”】部分,實現了綁定到ViewModel中的 ”SayHello” 方法。最后ViewModel中還有一個 “CanSayHello” 屬性,會關聯到方法 “SayHello”,綁定功能的可用性如讓對應的按鈕不可用。
這些功能,是VM的ActionMessage(綁定至方法)功能,和Conventions(約定)功能的體現。