CM中实现一个比较有意思的特性,就是智能匹配。
通常使用MVVM的写法:在匹配 View和ViewModel时会使用DataContext,在匹配数据属性时使用Binding,在匹配事件命令时使用Command。
而CM通过ElementConvention 实现它们的自动匹配,只需要遵循指定的命名规则[可自定义]。由于一个控件的事件有多种(比如:Button:Click,MouseEnter等等),CM提供了最常用的事件的绑定,可根据具体需求自定义。
自动绑定演示:
在View中添加如下代码:
<Window x:Class="Caliburn.Micro.Demo.ShellView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:cal="http://www.caliburnproject.org"> <Grid Background="White"> <TextBlock x:Name="TbMain" FontSize="50" /> <Button x:Name="OpenOneChild" Width="120" Height="30" Content="OpenOneWindow" /> </Grid> </Window>
在ViewModel中添加:
public class ShellViewModel : Caliburn.Micro.PropertyChangedBase, IShell { private readonly IWindowManager windowManager; [ImportingConstructor] public ShellViewModel(IWindowManager windowManager) { TbMain = "This is ShewView"; this.windowManager = windowManager; } private string _tbMain; public string TbMain { get { return _tbMain; } set { _tbMain = value; NotifyOfPropertyChange(() => TbMain); } } public void OpenOneChild() { ChildOneViewModel oneViewModel=new ChildOneViewModel(); windowManager.ShowDialog(oneViewModel); }
项目中新建一个ChildOneView.xaml和一个ChildOneViewModel.cs。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<Window x:Class="Caliburn.Micro.Demo.ChildOneView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Caliburn.Micro.Demo" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="ChildOneView" Width="300" Height="300" mc:Ignorable="d"> <StackPanel> <TextBlock x:Name="ChildOne" /> <TextBox Text="{Binding ChildOne}" /> <TextBox /> </StackPanel> </Window>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class ChildOneViewModel:Screen { public ChildOneViewModel() { ChildOne = "This is ChildOneView"; } private string _childOne; public string ChildOne { get { return _childOne; } set { _childOne = value; NotifyOfPropertyChange(()=>ChildOne); } } }
运行:
默认情况下,CM的Convention是默认开启的,可使用ViewModelBinder.ApplyConventionsByDefault = false;来关闭,或者直接使用通常写法,会自动覆盖Convention的自动绑定。
有些时候,在碰到一个属性绑定多个控件等问题时,用起来就不那么顺手了。所以平时也不太会使用此特性。
后面准备介绍一下数据绑定(Binding)和事件响应(Command)两大块的实现方式。