我有一个使用MVVM模式的WPF应用程序。将按钮连接到VM非常简单,因为它们实现了ICommand。我有一个类似的上下文菜单。下一步是为上下文菜单创建快捷键。我无法弄清楚如何让快捷键调用Command。这是一个例子:
<MenuItem Header="Update" Command="{Binding btnUpdate}" >
<MenuItem.Icon>
<Image Source="/Images/Update.png"
Width="16"
Height="16" />
</MenuItem.Icon>
</MenuItem>
现在我添加了这个:
<Window.InputBindings>
<KeyBinding Key="U"
Modifiers="Control"
Command="{Binding btnUpdate}" />
</Window.InputBindings>
尝试将快捷键连接到同一个绑定,但这不起作用。错误是:
错误169无法在“KeyBinding”类型的“Command”属性上设置“绑定”。 '绑定'只能在DependencyObject的DependencyProperty上设置。
有没有办法将此事件与命令挂钩?我无法弄清楚这一点。
提前感谢!
比尔
答案 0 :(得分:38)
以下代码可用于将快捷键直接绑定到命令:
<Window.InputBindings>
<KeyBinding Command="{Binding Path=NameOfYourCommand}"
Key="O"
Modifiers="Control"/>
</Window.InputBindings>
在视图的XAML代码中将Window.Resources添加后。
答案 1 :(得分:27)
我写了一个custom markup extension来“绑定”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
属性是依赖属性,因此它们可以正常绑定
答案 2 :(得分:8)
我同意在XAML中这样做是理想的,但为了完整起见,您还可以在代码中添加绑定。如果你在构造函数中执行它,只需确保它是在调用InitializeComponent()
InputBindings.Add(new KeyBinding(btnUpdate, new KeyGesture(Key.U, ModifierKeys.Control));
答案 3 :(得分:0)
已经能够在DataGrid级别添加Keybinding。像这样:
Xaml:
<DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding YourCollection}"
CanUserAddRows="False"
HeadersVisibility="Column"
CanUserDeleteRows="False"
CanUserSortColumns="True"
CanUserResizeRows="False"
CanUserResizeColumns="False"
SelectedItem="{Binding YourSelectedItem}"
SelectionMode="Single"
SelectionUnit="FullRow"
>
<DataGrid.ContextMenu>
<ContextMenu>
**<MenuItem Header="Delete" InputGestureText="Del" Command="{Binding DeleteCommand}">**
</MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
**<DataGrid.InputBindings>
<KeyBinding Key="Delete" Command="{Binding DeleteCommand}" CommandParameter="Delete"/>**
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridTextColumn Header="Column Header" Binding="{Binding YourColumn}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
查看型号:
public ICommand DeleteCommand
{
get
{
return new DelegateCommand(ExecuteCommand, CanExecute);
}
}
private void ExecuteCommand()
{
// your code to delete here.
YourCollection.Remove(YourSelectedItem);
}
private void CanExecute()
{
// logic to check if the delete command can execute.
return YourSelectedItem != null ;
}
答案 4 :(得分:-1)
WPF Application Framework (WAF)项目的ShortcutKey示例中显示了将WPF快捷键绑定到ViewModel的Command属性的替代方法。