Я разрабатываю функцию, в которой пользователь может нажать от 1 до 9 или от «а» до «z», которая выполняет команду в списке. Я создал поддержку чисел, но мне не очень нравится, как я это сделал.
<Grid.InputBindings>
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D0" CommandParameter="0" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D1" CommandParameter="1" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D2" CommandParameter="2" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D3" CommandParameter="3" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D4" CommandParameter="4" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D5" CommandParameter="5" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D6" CommandParameter="6" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D7" CommandParameter="7" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D8" CommandParameter="8" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D9" CommandParameter="9" />
</Grid.InputBindings>
Если я реализую оставшиеся символы таким же образом, у меня будет огромный список привязок. Не только для поддержки букв , но и numpad . Я бы предпочел проверить диапазоны символов, как я это делал с элементом управления Winform в другой части нашего приложения с кодом:
if (e.KeyValue >= '1' && e.KeyValue <= '9' ||
e.KeyValue >= 'A' && e.KeyValue <= 'Z')
{
FavoriteShortcutKeyPressedCallBack.Raise(e.KeyValue);
}
Я действительно думаю, что это возможно, но я не могу найти решение или найти в Интернете решение, которое соответствует шаблону MVVM.
Итак, в основном мой вопрос , как это можно сделать в WPF / MVVM более общим и элегантным образом?
Как я это решил
Я взял предложение из ответа mm8 , чтобы использовать EventToCommandBinding. Это привело к следующему коду в XAML:
<i:Interaction.Behaviors>
<behaviors:EventToCommandBehavior Event="PreviewTextInput"
Command="{Binding TextInputCommand}"
PassArguments="True" />
</i:Interaction.Behaviors>
ViewModel имеет TextInputCommand, который считывает текст из EventArgs и выбирает соответствующий элемент.
public RelayCommand<TextCompositionEventArgs> TextInputCommand { get; set; }
private void HandleTextInputCommand(TextCompositionEventArgs args)
{
SelectItemBoundToShortcut(args.Text);
}
Сначала я использовал событие KeyDown в качестве user1672994 , предложенного в комментариях. Но выяснилось, что мне приходилось учитывать разные раскладки клавиатуры и отдельно проверять наличие символов numpad. Использование события PreviewTextInput просто отправляет набранный текст, а это именно то, что мне нужно.