背景
在很多时候在WPF中我们都会使用到ICommand接口来定义我们的命令,然后将这个命令绑定到前台的控件比如Button上面,这个是一个很常规的操作,在后台的ViewModel中我们通常会使用一个实现了ICommand接口的DelegateCommand类来实例化我们定义的ICommand命令,我们这片文章来重点分析一下Prism中这个DelegateCommand会写出什么不同的东西。
常规实现
在看常规的实现之前我们首先来看看ICommand这个接口中到底定义了一些什么东西?
namespace System.Windows.Input { // // 摘要: // Defines a command. public interface ICommand { // // 摘要: // Occurs when changes occur that affect whether or not the command should execute. event EventHandler CanExecuteChanged; // // 摘要: // Defines the method that determines whether the command can execute in its current // state. // // 参数: // parameter: // Data used by the command. If the command does not require data to be passed, // this object can be set to null. // // 返回结果: // true if this command can be executed; otherwise, false. bool CanExecute(object parameter); // // 摘要: // Defines the method to be called when the command is invoked. // // 参数: // parameter: // Data used by the command. If the command does not require data to be passed, // this object can be set to null. void Execute(object parameter); } }
这个接口是定义在System.Windows.Input命令空间下面的,主要包括两个方法和一个事件,我们的继承类就是要实现这个接口中的这些方法和事件
/// <summary> /// 实现DelegateCommand /// </summary> internal class DelegateCommand : ICommand { /// <summary> /// 命令所需执行的事件 /// </summary> public Action<object> ExecuteCommand { get; set; } /// <summary> /// 命令是否可用所执行的事件 /// </summary> public Func<object, bool> CanExecuteCommand { get; set; } public DelegateCommand(Action<object> execute, Func<object, bool> canexecute) { ExecuteCommand = execute; CanExecuteCommand = canexecute; } /// <summary> /// 命令可用性获取 /// </summary> /// <param name="parameter"></param> /// <returns></returns> public bool CanExecute(object parameter) { return CanExecuteCommand(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } /// <summary> /// 命令具体执行 /// </summary> /// <param name="parameter"></param> public void Execute(object parameter) { ExecuteCommand(parameter); } }