Binding a WPF ShortCut Key to a Command in the ViewModel
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
The following code can be used to bind a shortcut key directly to a command:
<Window.InputBindings>
<KeyBinding Command="{Binding Path=NameOfYourCommand}"
Key="O"
Modifiers="Control"/>
</Window.InputBindings>
Add this after Window.Resources in the XAML code of your view.
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
I agree that doing it in XAML is ideal, but for completeness sake, you could also add your binding in code. If you do it in the constructor, just make sure it is after the call to InitializeComponent()
InputBindings.Add(new KeyBinding(btnUpdate, new KeyGesture(Key.U, ModifierKeys.Control));