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

  • 相关阅读:
    当开发者产生一个伟大的想法之后应该做的10件事
    PUT 还是 POST ?
    Failed to issue method call: Unit mysqld.service failed to load: No such file or directory.
    使用 Protocol Buffers 代替 JSON 的五个原因
    Java 打印堆栈的几种方法
    Eclipse调试Java的10个技巧
    如何使用命令查看系统名称?
    Feed系统架构资料收集
    dcm4chee 修改默认(0002,0013) ImplementationVersionName
    【原创】分布式之数据库和缓存双写一致性方案解析
  • 原文地址:https://www.cnblogs.com/kuangxiangnice/p/7040157.html
Copyright © 2011-2022 走看看