且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

将WPF ShortCut键绑定到ViewModel中的命令

更新时间:2022-10-21 09:48:33

我写了一个自定义标记扩展将绑定 InputBindings 命令,可以几乎像一个真正的绑定:

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

请注意,此标记扩展使用私有反射,因此只能在应用程序全部运行时使用信任...



另一个选项是使用 CommandReference 类。可以在MVVM工具包中找到 here 。这可能是一个更干净的方法,但使用起来有点复杂。



请注意,在WPF 4中, InputBinding.Command InputBinding.CommandParameter InputBinding.CommandTarget 属性是依赖属性,因此它们可以正常绑定


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

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