Binding a WPF ShortCut Key to a Command in the ViewModel

data-binding, mvvm, shortcut, wpf

Solution

I wrote a custom markup extension to "bind" `InputBindings` to commands, which can be used almost like a real binding :

<UserControl.InputBindings>
    <KeyBinding Modifiers="Control" 
                Key="E" 
                Command="{input:CommandBinding EditCommand}"/>
</UserControl.InputBindings>

Note that this markup extension uses private reflection, so it can only be used if your application runs in full trust...

Another option is to use the `CommandReference` class. It can be found in the MVVM toolkit available here. It's probably a cleaner approach, but a bit more complex to use.

Note that in WPF 4, the `InputBinding.Command`, `InputBinding.CommandParameter` and `InputBinding.CommandTarget` properties are dependency properties, so they can be bound normally

Problem

I have a WPF app that is using the MVVM pattern. Hooking up buttons to the VM is pretty straight forward since they implement the ICommand. I have a context menu that works similar. The next step is to create shortcut keys for the context menu. I can't figure out how to get the shortcut key invoke the Command. Here is an example: ``` <MenuItem Header="Update" Command="{Binding btnUpdate}" > <MenuItem.Icon> <Image Source="/Images/Update.png" Width="16" Height="16" /> </MenuItem.Icon> </MenuItem> ``` now I've added this: ``` <Window.InputBindings> <KeyBinding Key="U" Modifiers="Control" Command="{Binding btnUpdate}" /> </Window.InputBindings> ``` to try and connect the shortcut keys to the same binding, but this doesn't work. The error is: Error 169 A 'Binding' cannot be set on the 'Command' property of type 'KeyBinding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject. Isn't there a way to hook up this event to the Command? I can't figure this out. thanks in advance! Bill

Original source