一,什么是命令
根据microsoft的解释,command是一种不同于输入设备的语义级别上的输入处理机制。
Command的目的:
1)降低代码耦合度,将Command的逻辑和调用对象进行分离;
2)可以指定对象是否可用(例如:剪切按钮--在选中文本时才有效);
Command允许多个不同的对象可以调用同一个命令,也可以为不同的对象定义特殊的逻辑;
二,预定义的命令(predefined command)
1) ApplicationsCommands
APplicatinosCommands的MSDN解释
它包含的多有command如下图所示,
以上命令直接使用即可,例如Paste命令:
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste" />
</Menu>
<TextBox />
</StackPanel>
2)ComponentCommands
3)NavigationCommands,还有很多诸如:MediaCommands,EditiingCommands
三,Routed Command四个主要概念
1) command:表示要执行的操作;
public interface ICommand
{
/// <summary>当出现影响是否应执行该命令的更改时发生。</summary>
[__DynamicallyInvokable]
event EventHandler CanExecuteChanged;
/// <summary>定义确定此命令是否可在其当前状态下执行的方法。</summary>
/// <param name="parameter">
/// 此命令使用的数据。
/// 如果此命令不需要传递数据,则该对象可以设置为 <see langword="null" />。
/// </param>
/// <returns>
/// 如果可执行此命令,则为 <see langword="true" />;否则为 <see langword="false" />。
/// </returns>
[__DynamicallyInvokable]
bool CanExecute(object parameter);
/// <summary>定义在调用此命令时要调用的方法。</summary>
/// <param name="parameter">
/// 此命令使用的数据。
/// 如果此命令不需要传递数据,则该对象可以设置为 <see langword="null" />。
/// </param>
[__DynamicallyInvokable]
void Execute(object parameter);
}
所有的命令需要继承自接口ICommand。
Execute:执行与命令关联的操作。
CanExecute:决定对于当前目标command能否被执行。
CanExecuteChanged:当命令管理器检测到命令源更改时,可能使得已经激发但是未执行的命令无效。
2) command source:表示调用命令的对象;
所有command source需要继承ICommandSource。
/// <summary>定义一个知道如何调用命令的对象。</summary>
public interface ICommandSource
{
/// <summary>获取在调用命令源时执行的命令。</summary>
/// <returns>在调用命令源时执行的命令。</returns>
ICommand Command { get; }
/// <summary>表示可在执行命令时传递给该命令的用户定义的数据值。</summary>
/// <returns>命令特定数据。</returns>
object CommandParameter { get; }
/// <summary>在其上执行该命令的对象。</summary>
/// <returns>在其上执行该命令的对象。</returns>
IInputElement CommandTarget { get; }
}
3) command target:表示执行命令的对象;
4) command binding:建立源和目标的关系,映射命令和命令逻辑
在上面的例子中, paste--command,menuitem--command source, textbox--command target, command bingding由textbox控件提供。注意:command binding并不总是依赖于控件,也可以是自定义的。