本文主要介绍WinForm项目中如何像WPF一样优雅的使用Command来实现业务操作。想必大家已经疲于双击控件生成事件处理方法来实现业务操作,如多控件(按钮、菜单、工具条、状态栏等命令控件)来做同一个动作,还要控制它们启用(Enabled)状态等等,使代码结构冗长且可读性差。下面具体介绍和实现WinForm中对Command的应用。

  1. 命令(Command)

    顾 名思义,定义一个命令,继承至System.Windows.Input.ICommand接口,实现 Execute(object) ,CanExecute(object)方法和 CanExecuteChanged事件。由 CanExecute 确定是否调用 Execute 执行该命令。

     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     }
    Command 代码

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-03-31
  • 2021-10-19
猜你喜欢
  • 2021-06-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-10
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案