本文只介绍ViewModel First的方式,因为View First比较少用,虽然CM也支持。
在Visual Studio中新建一个WPF工程“Caliburn.Micro.Hello”。
在工程中添加2个依赖:System.Windows.Interactivity.dll 和 Caliburn.Micro.dll
删除MainPage.xaml,修改App.xaml.cs为如下形式:
namespace Caliburn.Micro.Hello {
using System.Windows;
public partial class App : Application {
public App() {
InitializeComponent();
}
}
}
创建ViewModel,ViewModel需要继承PropertyChangedBase,PropertyChangedBase实现了INotifyPropertyChanged接口,并让Notify事件在UI线程上执行。代码如下:
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));
}
}
}
使用CM就必需要有一个BootStraper,BootStraper对CM进行配置,并通过主ViewModel启动View。所以我们首先创建一个继承BootStraper的类。BootStraper最简单的形式如下:
namespace Caliburn.Micro.Hello {
public class HelloBootstrapper : BootstrapperBase {
public HelloBootstrapper() {
Initialize();//必须有这一句,这一句实际上对CM进行了配置并启动了程序
}
protected override void OnStartup(object sender, StartupEventArgs e)//事实上就是Application的Startup事件
{ DisplayRootViewFor<ShellViewModel>();//新建ShellViewModel的一个实例,并找到ShellView,绑定并显示。这一句也必须,当然如果不显示程序界面可以不要。
}
}
}
BootStraper必须在Application.Run之前实例化,在WPF中可以把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>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<local:HelloBootstrapper x:Key="bootstrapper" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
App.xaml会在关联的类(Caliburn.Micro.Hello.App)的构造函数执行后自动被调用。当如也可以在构造函数内添加InitializeComponent函数自行调用。
在CM中View可以是一个window,也可以是一个控件,如果用DisplayRootViewFor显示一个控件的话,CM会自动把控件放在一个窗口中。
<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>
编译运行程序,就ok了。
CM可以通过ViewModels找到对应的View,它相当于把ViewModel全名中的Model删除得到View的名称。比如把MyApp.ViewModels.MyViewModel对应到MyApp.Views.MyView。在本程序中VM中的“Name”被自动绑定到了View中x:Name=”Name”的TextBox上。x:Name=”SayHello”的按钮也自动绑定了VM中的SayHello方法,“CanSayHello”属性关联“SayHello”方法和Button的disable属性。这是最基本的CM协定规则,请在程序中查看。