命令
事件的作用是发布、传播一些消息,消息送达接受者,事件的使命也就完成了,
至于如何响应事件送来的消息事件并不做规定,每个接收者可以使用自己的行为来响应事件。
也就是说,事件不具有约束力。
命令与事件的区别就在与命令是具有约束力的。
实际编程工作中就算只使用事件、不使用命令,程序的逻辑也一样可以被驱动得很好,
但我们不能阻止程序员按自己的习惯去编写代码。
(
比如保存事件的处理器,程序员们可以写Save()、SaveHandler()、SaveDocument()......这些都符合代码规范,
但迟早有一天整个项目会变得无法被读懂,新来的程序员或修改bug的程序员会很抓狂。
如果使用命令,情况会好很多——当Save命令到达某个组件式,命令会主动去调用组件的Save()方法,而这个
方法可能被定义在基类或者接口里(即保证了这个方法一定是存在的),这就在代码结构和命名上做了约束。
不但如此,命令还可控制接受者“先做校验、再保存、然后关闭”,也就是说,命令除了可以约束代码,还可以约束
步骤逻辑,这让新来的程序员想犯错都难,也让修改bug的程序员很快能找到规律、容易上手。
)
WPF的命令系统由几个基本要素构成:
■命令(Command):WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类。
■命令源(Command Source):基命令的发送者,是实现了ICommandSource接口的类。很多界面元素都实现了这个
接口,其中包括Button、MenuItem、ListBoxItem等。
■命令目标(Command Target):即命令将发送给谁,或者说命令将作用在谁身上。命令目标必须是实现了IInputElement接口的类。
■命令关联(Command Binding):负责把一些外围逻辑与命令关联起来,比如执行之前对命令是否可以执行进行判断、
命令执行之后还有那些后续工作等。