16、WPF中的命令
一、前言
事件的作用是发布、传播一些信息,消息送达接收者,事件的使命就算完成了,至于如何响应事件送来的消息事件并不做规定,每个接收者可以使用自己的行为来响应事件,也就是说事件不具有约束力。命令能够在代码结构和命名上做约束,还可以约束步骤逻辑。
二、命令系统的基本元素
*命令(Command):WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类。
*命令源(Command Source):即命令的发送者,是实现了ICommandSource接口类。
*命令目标(Command Target): 即命令将发送给谁,或者说命令将作用在谁身上。命令目标必须是实现了IInputElement接口类。
*命令关联(Command Binding):负责把一些外围逻辑与命令关联起来,比如执行命令之前对命令是否可以执行进行判断、命令执行之后还有哪些工作要做等。
基本元素之间的关系
(1)创建命令类:即获得一个实现ICommand接口的类,如果命令与具体业务逻辑无关则使用WPF类库中的RoutedCommand类即可。如果想得到与业务逻辑相关的专有命令,则需创建RoutedCommand(或者ICommand接口)的派生类。
(2)声明命令实例:使用命令时需要创建命令类的实例。一般情况下程序中某种操作只需要一个命令实例与之对应即可。比如保存这个操作,你可以拿同一个实例去命令每个组件执行其保存功能,因此程序中的命令多使用单例模式以减少代码的复杂度。
(3)指定命令的源:即指定由谁来发送这个命令。注意一旦把命令指派给命令源,那么命令源就会受命令的影响,当命令不能被执行的时候作为命令源的控件将处在不可用状态。
(4)指定命令目标:命令目标并不是命令的属性而是命令源的属性,指定命令目标是告诉命令源向哪个组件发送命令,无论这个组件是否拥有焦点他都会收到这个命令。如果没有为命令源指定命令目标,则WPF系统认为当前拥有焦点的对象就是命令目标。
(5)设置命令关联:WPF命令需要CommandBinding在执行前来帮助判断是不是可以执行、在执行后还需要做哪些事件。
在命令目标和命令关联之间还有一个微妙的关系,无论命令目标是程序员指定还是由WPF系统根据焦点所在地判断出来的,一旦某个UI组件被命令源“瞄上”,命令源就会不停地向命令目标“投石问路”,命令目标就会不停地发送出可路由的PreviewCanExecute和CanExecute附加事件,事件会沿着UI元素树向上传递并命令关联所捕捉,命令关联捕捉到这些事件后会把命令能不能发送实时报告给命令
三、WPF中的命令库
命令具有“一处声明,处处使用”的特点
WPF类库里的命令库:ApplicationCommands ComponetCommands NavigationCommands MediaCommands EditingCommands (都是静态类)
命令参数:WPF预制的命令是这些类库中的静态属性,所以他们的实例永远只有一个,如果街面上有两个按钮,一个用来新建Teacher的档案,一个用来新建Student的档案,都使用New命令的话,程序应该如何区别新建的是什么档案呢?使用CommandPrameter,命令源一定是实现了IComamandSource接口的对象,而ICommandSource有一个属性就是CommandPrameter.