WPF真入门教程24--MVVM模式Command命令

在上一节的MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新。但是这并不是我们使用MVVM的正确方式。MVVM的目的是为了最大限度地降低了Xaml文件和CS文件的耦合度,分离界面和业务逻辑,所以我们要通过命令(Command)的来将Button的事件分离出来。

       因为本文中需要使用Command命令,我们先来简单了解Command命令。在WPF中使用命令的步骤很简单

1.创建命令

2.绑定命令

3.设置命令源

4.设置命令目标

      WPF中命令的核心是System.Windows.Input.ICommand接口,所有命令对象都实现了此接口。当创建自己的命令时,不能直接实现ICommand接口,而是要使用System.Windows.Input.RouteCommand类,该类已经实现了ICommand接口,所有WPF命令都是RouteCommand类的实例。在程序中处理的大部分命令不是RoutedCommand对象,而是RoutedUICommand类的实例,它继承自RouteCommand类。

       WPF提供了一个很好的方式来解决事件绑定的问题ICommand。很多控件都有Command属性,如果没有,我们可以将命令绑定到触发器上。接下来我们来先实现一个ICommand接口。ICommand需要用户定义两个方法bool CanExecute和void Execute。第一个方法可以让我们来判断是否可以执行这个命令,第二个方法就是我们具体的命令。

1、在项目中创建一个文件夹common,再添加一个类RelayCommand,这个类就是命令执行的代理类,完整代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace WpfApp6.common
{
    /// <summary>
    /// 代理命令类
    /// </summary>
    public class RelayCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        /// <summary>
        /// 要执行的操作
        /// </summary>
        private Action<object> executeActions;
        /// <summary>
        /// 是否可以执行的委托
        /// </summary>
        private Func<object, bool> canExecuteFunc;
        /// <summary>
        /// 构造函数 无参构造
        /// </summary>
        public RelayCommand() { }
        /// <summary>
        /// 通过执行的委托构造
        /// </summary>
        /// <param name="execute"></param>
        public RelayCommand(Action<object> execute) : this(execute, null)
        {

        }
        /// <summary>
        /// 通过执行的操作与是否可执行的委托
        /// </summary>
        /// <param name="execute">要执行的操作</param>
        /// <param name="canExecute">是否可以被执行</param>
        public RelayCommand(Action<object> execute, Func<object, bool> canExecute)
        {
            this.executeActions = execute;
            this.canExecuteFunc = canExecute;
        }

        /// <summary>
        /// 命令是否可以执行
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns> 
        public bool CanExecute(object parameter)
        {
            if (canExecuteFunc != null)
            {
                return this.canExecuteFunc(parameter);
            } 
            else
            {
                return true;
            } 
        }
        /// <summary>
        /// 要执行的操作
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(object parameter)
        {
            if (executeActions == null)
            {
                return;
            } 
            this.executeActions(parameter);
        }
        /// <summary>
        /// 执行CanExecuteChanged事件
        /// </summary>
        public void OnCanExecuteChanged()
        {
            this.CanExecuteChanged?.Invoke(this, new EventArgs());
        }


    }
}

2、在上节代码的基础上,界面上添加一个按钮,如图:

3、修改EmpViewModel2.cs,在里面增加代码:

 4、运行程序,效果如下:

 对于 ICommand 的一些理解:

在笔者看来,ICommand 就是对函数的一种封装。只是在调用这个函数前,必须进行一个可执行判定。

比如,在假期中使用滴滴打车。

执行参数:打车距离

执行函数:将乘客送到目的地。

可执行条件:打车距离必须大于5公里,才会有司机接单。

上述看法,只是单独从接口本来而言。

WPF 中为什么要定义 ICommand ?在 WPF 中定义这样一个接口的目的是为了实现 MVVM 的框架设计,换一种的说法就是为了解耦。 

小结:ICommand 是 MVVM 的核心组件。 ICommand 在 MVVM 中经常使用,它提供了View和ViewModel(用户界面和业务逻辑)之间的分离逻辑。 XAML 提供了一种通过 ICommand 更好地绑定 GUI 事件的方法。 ICommand 要求用户定义两个方法,bool CanExecute 和 void Execute。 CanExecute 方法只是告诉用户,我可以执行这个 Action 吗? 这对于控制 GUI 元素的可操作性非常有用。

ICommand 非常简单,但是也可以完在更加有趣和复杂的功能。 ICommand 将用户界面集成到业务逻辑中,或者在视图与视图模型之间进行直接通信。 它还为视图提供了更新模型/视图模型的机制。 

这一波操作,又成功了。后面继续精彩人生。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqwest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值