ViewModel&中的RoutedUICommand与ICommand使用InputBinding

时间:2012-02-03 16:09:39

标签: wpf xaml data-binding icommand

基本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后面的代码中。

1 个答案:

答案 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