У меня есть приложение WPF, которое использует шаблон MVVM. Кнопки присоединения к 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 А 'Привязка' не могут быть установлены на свойстве 'Command' типа 'Привязка клавиш'. 'Привязка' может только быть установлена на DependencyProperty DependencyObject.
Разве там путь не состоит в том, чтобы поднять трубку это событие к Команде? Я не могу понять это.
заранее спасибо!
Счет
Я написал настраиваемое расширение разметки для «привязки» InputBindings
к командам, которые можно использовать почти как реальная привязка:
<UserControl.InputBindings>
<KeyBinding Modifiers="Control"
Key="E"
Command="{input:CommandBinding EditCommand}"/>
</UserControl.InputBindings>
Обратите внимание, что это расширение разметки использует частное отражение, поэтому его можно использовать только в том случае, если ваше приложение работает с полным доверием ...
Другой вариант - использовать класс CommandReference
. Его можно найти в наборе инструментов MVVM, доступном здесь . Вероятно, это более чистый подход, но он немного сложнее в использовании.
Обратите внимание, что в WPF 4 свойства InputBinding.Command
, InputBinding.CommandParameter
и InputBinding.CommandTarget
являются свойствами зависимости, поэтому их можно связывать обычным образом.
Альтернативный подход для привязки WPF Shortcut Key к свойству Command модели ViewModel показан в примере ShortcutKey проекта WPF Application Framework (WAF) .
Я согласен, что делать это в XAML идеально, но для полноты картины вы также можете добавить ваша привязка в коде. Если вы сделаете это в конструкторе, просто убедитесь, что это происходит после вызова InitializeComponent ()
InputBindings.Add(new KeyBinding(btnUpdate, new KeyGesture(Key.U, ModifierKeys.Control));