将 ICommand 绑定到 MenuItem 并分配 ShortCut

Binding an ICommand to a MenuItem and assign a ShortCut

我有以下场景:

具有多个 ICommand (RelayCommand) 属性的 ViewModel。这些属性绑定到视图中的菜单项。一些菜单项应该有一个键盘快捷键。为此,我尝试使用 window 的 InputBindings。这有效 - 但我必须手动将 InputGestureText 分配给 MenuItem。所以我想有更好的方法将 ICommand 绑定到 MenuItem 并分配快捷方式...

// ViewModel
class MyViewModel: ViewModelBase {
    public ICommand TestCommand {get; set;}
}

// View
<Window...>

    <Window.InputBindings>
        <KeyBinding Command="{Binding TestCommand}" Key="R" Modifiers="Control" />
    </Window.InputBindings>

    // ...
    <MenuItem Name="MenuItemTest" Command="{Binding TestCommand}"
              Header="Test" InputGestureText="Ctrl + R" />

</Window>

InputGestureText 属性 仅用于设置文本, 描述 将调用与命令关联的命令的输入手势。

不会以某种方式将输入手势与菜单项相关联;它只是将文本添加到菜单项。这记录在 MSDN 上:https://msdn.microsoft.com/en-us/library/system.windows.controls.menuitem.inputgesturetext(v=vs.110).aspx.

所以不,没有更好的方法来做你正在做的事情:)

可能我来晚了一点,但是:

菜单项上的自动快捷方式提示适用于 RoutedCommand

public static readonly RoutedUICommand NewProject = new RoutedUICommand() { InputGestures = { new KeyGesture(Key.N, ModifierKeys.Control) } };

如果你这样做 - 你将使你的热键工作(即使在 window 中没有输入绑定)并且你会在绑定到此命令的任何菜单项中看到此热键。这仅适用于 RoutedCommand(类型在 WPF 源代码中是硬编码的)。如果您的命令不是 RoutedCommand(而且它不是,因为您使用 ICommand 模式)- 您 必须 自己设置手势提示。

因此有两种选择:使用 RoutedCommand 和它们的事件处理程序(在 UI 代码中!)或实现您自己的命令并使用快捷方式提示做任何您能做的事情。