Command
与事件相比,命令具有约束力,命令除了约束代码,还可以约束步骤逻辑。
一、命令系统的基本元素及其关系
1. 基本元素
- 命令: 实现了ICommand接口的类(常用RoutedCommand/自定义);
- 命令源: 实现了ICommandSource接口的类(Button、MenuItem、ListBoxItem等);
- 命令目标: 命令作用的对象,实现了IInputElement接口的类;
- 命令关联: 负责将外围逻辑和命令关联起来。
2. 基本元素之间的关系
二、使用命令的步骤
- 创建命令类: 获得一个实现ICommand接口的类;
命令与具体业务逻辑无关:RoutedCommand;
命令与具体业务逻辑有关:创景RoutedCommand或ICommand的派生类; - 声明命令实例;
- 指定命令源: 同一个命令可以有多个源;
- 指定命令目标: 命令目标是命令源的属性;
- 设置命令关联:
向上:绑定命令的源和目标后,命令目标会不停发送可路由的附加事件PreviewCanExecute和CanExecute向上路由,事件被命令关联捕捉后,命令关联将能否发送命令报告给命令;
向下:命令被下发至命令目标后,命令目标发送附加事件PreviewExecute和Execute向上路由,完成后续任务。
完整使用命令步骤的例程:
C#:
//声明命令
private RoutedCommand clearCmd = new RoutedCommand("Clear", typeof(Page3));
//定义命令(也可在xaml中关联,命令的事件处理器定义在后台)
private void InitializeCommand()
{
//把命令赋值给命令源(发送者)并指定快捷键
this.button1.Command = this.clearCmd;
this.clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt));//只负责跑腿,真正的工作有cb_Executed完成
//指定命令目标
this.button1.CommandTarget = this.textBoxA;
//创建命令关联
//关联一定要安装在命令目标的外围控件上!!!否则无法捕捉到CanExecute和Execute命令
CommandBinding cb = new CommandBinding();
cb.Command = this.clearCmd;//只关注与clearCmd相关的事件
cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);
cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);
//把命令关联安置在外围控件上
this.empty.CommandBindings.Add(cb