zoukankan      html  css  js  c++  java
  • 使用Caliburn.Micro系列2:Convention

    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。

    <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>
    View Code
    public class ChildOneViewModel:Screen
        {
            public ChildOneViewModel()
            {
                ChildOne = "This is ChildOneView";
            }
    
            private string _childOne;
            public string ChildOne
            {
                get { return _childOne; }
                set
                {
                    _childOne = value;
                    NotifyOfPropertyChange(()=>ChildOne);
                }
            }
    
        }
    View Code

    运行:

     默认情况下,CM的Convention是默认开启的,可使用ViewModelBinder.ApplyConventionsByDefault = false;来关闭,或者直接使用通常写法,会自动覆盖Convention的自动绑定。

    有些时候,在碰到一个属性绑定多个控件等问题时,用起来就不那么顺手了。所以平时也不太会使用此特性。

    后面准备介绍一下数据绑定(Binding)和事件响应(Command)两大块的实现方式。

    源码文件:http://pan.baidu.com/s/1gfHyhQN

  • 相关阅读:
    Linux中的官方源、镜像源汇总
    提示"libc.so.6: version `GLIBC_2.14' not found"
    win8.1 安装msi软件出现 2503、2502
    平均负载(Load average)
    oracle 导入报错:field in data file exceeds maximum length
    一个命令的输出作为另外一个命令的输入
    Http 状态码
    Linux 命令总结
    ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法
    轻松应对IDC机房带宽突然暴涨问题
  • 原文地址:https://www.cnblogs.com/kuangxiangnice/p/7040157.html
Copyright © 2011-2022 走看看