Привязка клавиши быстрого вызова WPF к команде в модели представления - PullRequest
37 голосов
/ 05 марта 2010

У меня есть приложение WPF, которое использует шаблон MVVM. Подключить кнопки к виртуальной машине довольно просто, поскольку они реализуют ICommand. У меня есть контекстное меню, которое работает аналогично. Следующим шагом является создание сочетаний клавиш для контекстного меню. Я не могу понять, как получить горячую клавишу вызова команды. Вот пример:

<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». «Привязка» может быть установлена ​​только в свойстве DependencyProperty объекта DependencyObject.

Разве нет способа соединить это событие с Командой? Я не могу понять это.

спасибо заранее!

Bill

Ответы [ 5 ]

39 голосов
/ 19 февраля 2012

Следующий код можно использовать для привязки сочетания клавиш непосредственно к команде:

<Window.InputBindings>
    <KeyBinding Command="{Binding Path=NameOfYourCommand}" 
                Key="O" 
                Modifiers="Control"/>
</Window.InputBindings>

Добавьте это после Window.Resources в коде XAML вашего представления.

27 голосов
/ 05 марта 2010

Я написал пользовательское расширение разметки для «связывания» InputBindings с командами, которое можно использовать почти как реальное связывание:

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

Обратите внимание, что это расширение разметки использует частное отражение, поэтому его можно использовать, только если ваше приложение работает с полным доверием ...

Другой вариант - использовать класс CommandReference. Его можно найти в наборе инструментов MVVM, доступном здесь . Это, вероятно, более чистый подход, но немного более сложный в использовании.

Обратите внимание, что в WPF 4 свойства InputBinding.Command, InputBinding.CommandParameter и InputBinding.CommandTarget являются свойствами зависимости, поэтому они могут быть связаны в обычном режиме

8 голосов
/ 25 мая 2010

Я согласен, что делать это в XAML идеально, но для полноты вы также можете добавить свою привязку в коде.Если вы делаете это в конструкторе, просто убедитесь, что это после вызова InitializeComponent()

InputBindings.Add(new KeyBinding(btnUpdate, new KeyGesture(Key.U, ModifierKeys.Control));
0 голосов
/ 08 августа 2016

удалось добавить связывание клавиш на уровне DataGrid. Как это:

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 ;
}
0 голосов
/ 07 марта 2010

Альтернативный подход для привязки сочетания клавиш WPF к свойству Command модели ViewModel показан в образце ShortcutKey * проекта *1003* 1004 *.

...