基本ICommand接口实现(例如DelegateCommand和RelayCommand)缺少RoutedCommand类中包含的InputGestures属性。此属性支持绑定到KeyGesture,RoutedUICommand中的Text属性支持设置控件的标头。例如:
<MenuItem Header="File">
<MenuItem Command="Open" />
结果是一个菜单项,标记为:“文件”菜单项下的“打开Ctrl + O”。对于手势,InputBindings会将输入的guest虚拟机映射到命令,但是您放弃了InputGestureText支持。
如何在定义KeyGestures&amp ;;时保持绑定到视图模型的ICommands的简单性? XAML或视图模型中的命令的文本?例如,我想在上下文菜单和主菜单中显示一个命令,以显示相同的Header&amp; InputGestureText,由RoutedUICommand支持,但命令的实现在视图模型中,而不在Window后面的代码中。
答案 0 :(得分:5)
查看反射器中的MenuItem
,我们可以看到MenuItem如何获取Header
/ InputGesture
值,即:
private static object CoerceInputGestureText(DependencyObject d, object value)
{
RoutedCommand command;
MenuItem item = (MenuItem) d;
if ((string.IsNullOrEmpty((string) value) &&
!item.HasNonDefaultValue(InputGestureTextProperty)) &&
((command = item.Command as RoutedCommand) != null))
{
InputGestureCollection inputGestures = command.InputGestures;
// Get appropriate gesture....
}
return value;
}
有类似的代码可以根据当前命令强制Header属性,但在这种情况下,它会查找RoutedUICommand
。这告诉我们,命令必须是RoutedCommand
/ RoutedUICommand
的实例才能利用MenuItem
的此功能。
查看反射器中的RoutedCommand
,没有一种简单的方法来创建源自DelegateCommand
的{{1}},因为它是RoutedCommand
/ CanExecute
方法不是虚拟的。
我们可以编写类似的代码:
Execute
但这并不妨碍调用public class DelegateCommand : RoutedCommand, ICommand
{
bool ICommand.CanExecute(object parameter) {
// Insert delegate can execute logic
}
void ICommand.Execute(object parameter) {
// Insert delegate execute logic
}
}
上的非显式CanExecute
/ Execute
方法。这可能是也可能不是问题。
或者,我们可以创建一个足够聪明的自定义RoutedCommand
来查找我们的DelegateCommand(或其他地方)并使用它的文本/手势。
MenuItem