I created a very simple test program to try to understand KeyBinding
in WPF, but it’s not working the way I expect it, in fact it doesn’t work at all in most of the cases. Maybe you can point out what I’m doing wrong or what is not supposed to work.
I have a DelegateCommand
or RelayCommand
class (or whatever it is called in your case), that is implementing ICommand
and takes an Action
, that is supposed to be called, when the ICommand
is executed.
Then I created a simple view model that only contains three commands (for the sake of simplicity my example code does only show one of the commands, the other commands are for Ctrl-B and Ctrl+C.
Public Class MainViewModel
Inherits ViewModelBase
Private _keyBindingCommandCtrlA As ICommand = New DelegateCommand(AddressOf Me.KeyBindingCtrlAFired)
Private Sub KeyBindingCtrlAFired(obj As Object)
MessageBox.Show("Ctrl+A")
End Sub
Public ReadOnly Property KeyBindingCommandCtrlA As ICommand
Get
Return _keyBindingCommandCtrlA
End Get
End Property
End Class
Then I created two custom controls “Level1” and “Level2”.
“Level2” just contains a defined KeyBinding
for Ctrl+C like this:
<UserControl.InputBindings>
<KeyBinding Key="C" Modifiers="Ctrl" Command="{Binding KeyBindingCommandCtrlC}" />
</UserControl.InputBindings>
“Level1” contains a defined KeyBinding
for Ctrl+B and the “Level2” control (not shown in the example):
<UserControl.InputBindings>
<KeyBinding Key="B" Modifiers="Ctrl" Command="{Binding KeyBindingCommandCtrlB}" />
</UserControl.InputBindings>
My main window contains a reference to the view model, a KeyBinding
for Ctrl+A and it contains the “Level1” control (not shown in the example).
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<Window.InputBindings>
<KeyBinding Key="A" Modifiers="Ctrl" Command="{Binding KeyBindingCommandCtrlA}" />
</Window.InputBindings>
When I run this example program I would have expected that all three KeyBinding
s work, so, when I press Ctrl+A, Ctrl+B or Ctrl+C, I’d see a message box telling me Ctrl+A, Ctrl+B or Ctrl+C.
But only Ctrl+A works. when pressing Ctrl+B or Ctrl+C nothing happens.
Then I tried something else. I removed the KeyBinding
s in “Level1” and “Level2” and added a KeyBinding
for Ctrl+B directly to the “Level1” control in my main window like this:
<local:Level1Control>
<local:Level1Control.InputBindings>
<KeyBinding Key="B" Modifiers="Ctrl" Command="{Binding KeyBindingCommandCtrlB}" />
</local:Level1Control.InputBindings>
</local:Level1Control>
But that didn’t help either, when pressing Ctrl+B nothing happens.
So, how do I get KeyBinding
s to work, when they’re not defined at Window
level?