zoukankan      html  css  js  c++  java
  • WPF-MVVM-ICommand接口实现

    一 接口分析
    MVVM框架的目的就是让视图和业务逻辑分离,各干各的。那么怎样实现分离呢,精髓就是绑定ICommand。先看一下ICommand接口的定义:

    //
        // 摘要:
        //     定义一个命令。
        [TypeConverter("System.Windows.Input.CommandConverter, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null")]
        [TypeForwardedFrom("PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
        [ValueSerializer("System.Windows.Input.CommandValueSerializer, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null")]
        public interface ICommand
        {
            //
            // 摘要:
            //     当出现影响是否应执行该命令的更改时发生。
            event EventHandler CanExecuteChanged;
    
            //
            // 摘要:
            //     定义确定此命令是否可在其当前状态下执行的方法。
            //
            // 参数:
            //   parameter:
            //     此命令使用的数据。 如果此命令不需要传递数据,则该对象可以设置为 null。
            //
            // 返回结果:
            //     如果可执行此命令,则为 true;否则为 false。
            bool CanExecute(object parameter);
            //
            // 摘要:
            //     定义在调用此命令时要调用的方法。
            //
            // 参数:
            //   parameter:
            //     此命令使用的数据。 如果此命令不需要传递数据,则该对象可以设置为 null。
            void Execute(object parameter);
        }

    下面对接口中给的几个组成部分进行分析:
    CanExecuteChanged:按照官方的说法是在调用CanExecute方法之前被触发
    参考这个https://msdn.microsoft.com/zh-cn/library/system.windows.input.icommand.canexecutechanged.aspx

    CanExecute:这个方法返回值为bool值,绑定到此命令的按钮是否可用。
    这个方法在用户点击按钮后,自动触发。
    Execute:这个方法就是业务逻辑的载体,用户点击按钮后,自动触发。

    二 继承关系
    首先需要对接口ICommand进行实现,比如叫做DelegateCommand。那么我们如何进行实现呢,把业务逻辑卸载接口的实现类里面吗?如果这样,那么每个按钮都需要定义一个ICommand的实现类了。我们引入委托的概念,把具体的的业务实现写在viewmodel类中,然后把业务实现类封装成委托交给ICommand实例来调用, 从而实现了DelegateCommand的复用。
    比如下面的例子,Execute执行的是一个委托,并且把委托定义为public类型,以便于外面的viewmodel给委托进行赋值,如果不给委托赋值就代表不执行喽。

    class DelegateCommand : ICommand
    {
      public bool CanExecute(object parameter)
      {
        if (this.CanExecuteFunc == null)
        {
        return true;
        }
    
        return this.CanExecuteFunc(parameter);
      }
    
      public event EventHandler CanExecuteChanged;
    
      public void Execute(object parameter)
      {
        if (this.ExecuteAction == null)
        {
        return;
        }
        this.ExecuteAction(parameter);
      }
    
      public Action<object> ExecuteAction { get; set; }
      public Func<object, bool> CanExecuteFunc { get; set; }
    }
    

      

    三 ViewModel
    如何编写viewmodel呢?
    新建一个viewmodel类,比如:MainWindowViewModel.cs
    定义一个command,如:public DelegateCommand AddCommand { get; set; }
    然后再进行给command中的委托赋值,这样程序就会通过调用Execute,调用委托,达到调用viewmodel中的业务逻辑了。
    比如业务逻辑方法这样写:

    private void Add(object parameter)
    {
        this.Result = this.Input1 + this.Input2;
    }
    

      


    为command中的委托赋值:

    this.AddCommand.ExecuteAction = new Action<object>(this.Add);
    

      


    是不是有点绕呢,没错太绕了。网上有很多中写法,乱花渐欲迷人眼,但基本上都是这个意思。

    四 界面绑定
    先将MainWindowViewModel的实例,作为当前界面的上下文:
    this.DataContext = new MainWindowViewModel();
    xaml很简单,就这样一行代码
    <Button x:Name="addButton" Grid.Row="3" Content="Add" Width="120" Height="80" Command="{Binding AddCommand}"/>
    另外如果想再传会一个参数,可以这样写(详见demo):
    Command="{Binding AddCommand}" CommandParameter="para1"

    至于如何将鼠标的位置,按钮自身的信息传递到vm中,就比较复杂了,请参考其它文献。也可以在view的后台中进行处理,毕竟是界面相关的东西。

    五 原理分析
    那么CanExecute和Execute这两个方法是如何被调用的呢?难道是框架自己调用的吗?有一定关系,主要是和wpf绑定机制有关。当我们把一个Icommand实例绑定到界面的按钮上,点击按钮,则会触发ICommand中的方法Execute。至于为什么会触发,只能说微软自己封装的,不用我们自己来触发。

    下面有两个demo仅供参考。

    http://download.csdn.net/download/conganguo/10120119
    ---------------------
    作者:12345678910dddwwwb
    来源:CSDN
    原文:https://blog.csdn.net/conganguo/article/details/78542968
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    基于I2C总线的MPU6050学习笔记
    基于I2C总线的0.96寸OLED显示屏驱动
    I2C总线协议的软件模拟实现方法
    I2C总线通讯协议
    Exynos4412从SD卡启动的简单网络文件系统制作
    多版本 PHP 环境下,使用指定版本运行composer
    腾讯云服务器 lnmp 开启 MySQL 远程访问权限
    MySQL添加新用户和新增权限
    Laravel 框架创建软链接
    Git 保存登录凭证
  • 原文地址:https://www.cnblogs.com/zunzunQ/p/10746383.html
Copyright © 2011-2022 走看看