本文主要介绍WinForm项目中如何像WPF一样优雅的使用Command来实现业务操作。想必大家已经疲于双击控件生成事件处理方法来实现业务操作,如多控件(按钮、菜单、工具条、状态栏等命令控件)来做同一个动作,还要控制它们启用(Enabled)状态等等,使代码结构冗长且可读性差。下面具体介绍和实现WinForm中对Command的应用。
-
命令(Command)
顾 名思义,定义一个命令,继承至System.Windows.Input.ICommand接口,实现 Execute(object) ,CanExecute(object)方法和 CanExecuteChanged事件。由 CanExecute 确定是否调用 Execute 执行该命令。
Command 代码1 /// <summary> 2 /// 定义一个执行的命令。 3 /// </summary> 4 public abstract class Command : ICommand 5 { 6 /// <summary> 7 /// The can executable 8 /// </summary> 9 private bool canExecutable = true; 10 11 /// <summary> 12 /// 当出现影响是否应执行该命令的更改时发生。 13 /// </summary> 14 public event EventHandler CanExecuteChanged; 15 16 /// <summary> 17 /// 定义用于确定此命令是否可以在其当前状态下执行的方法。 18 /// </summary> 19 /// <param name="parameter">此命令使用的数据。 如果此命令不需要传递数据,则该对象可以设置为 null。</param> 20 /// <returns>如果可以执行此命令,则为 true;否则为 false。</returns> 21 public abstract bool CanExecute(object parameter); 22 23 /// <summary> 24 /// 定义在调用此命令时调用的方法。 25 /// </summary> 26 /// <param name="parameter">此命令使用的数据。 如果此命令不需要传递数据,则该对象可以设置为 null。</param> 27 public abstract void Execute(object parameter); 28 29 30 /// <summary> 31 /// 提升命令状态更改。 32 /// </summary> 33 /// <param name="parameter">The parameter.</param> 34 internal protected void RaiseCommandState(object parameter) 35 { 36 var able = CanExecute(parameter); 37 if (able != canExecutable) 38 { 39 canExecutable = able; 40 OnCanExecuteChanged(EventArgs.Empty); 41 } 42 } 43 44 /// <summary> 45 /// 触发当命令状态更改事件。 46 /// </summary> 47 /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> 48 protected virtual void OnCanExecuteChanged(EventArgs e) 49 { 50 if (CanExecuteChanged != null) 51 { 52 CanExecuteChanged(this, e); 53 } 54 } 55 }