Как обработать событие нажатия клавиши во ViewModel, используя Prism 6 в WPF?
У меня есть ситуация, когда мне нужно обработать событие нажатия клавиши, оно может быть любым от AZ, 0-9, но мне нужно обработать это в ViewModel. Для того, чтобы какая-то клавиша была нажата, она должна быть передана в ViewModel. Я использую призму 6.0, поэтому View1ViewModel автоматически подключается к view1.
Я знаю, что с конкретными ключами я могу справиться, но как сделать то же самое для всех ключей.
У меня есть свойство во ViewModel "KeyPressed", и я попробовал приведенный ниже код в коде позади
private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
_mainWindowViewModel.KeyPressed = e.Key;
}
Но этот код не обновляет View1ViewModel, как в viewmodel фреймворка Prism, и привязка вида осуществляется через фреймворк. Я попытался использовать взаимодействие, я положил ниже код в корне Grid
раздел.
<i:Interaction.Triggers >
<i:EventTrigger EventName="KeyUp">
<i:InvokeCommandAction Command="{Binding KeyUpEventCommand}"
CommandParameter="..."/>
</i:EventTrigger>
</i:Interaction.Triggers>
Событие запускается, но поскольку параметра Command нет, его значение равно null. Мне нужно передать команду Parameter, но не знаю, какой она должна быть!
В ViewModel:
public DelegateCommand KeyUpEventCommand { get; private set; }
private string strAlphabet;
public string Alphabets
{
get { return strAlphabet; }
set { SetProperty(ref strAlphabet, value); }
}
public MainWindowViewModel(IEventAggregator eventAggregator)
{
KeyUpEventCommand = new DelegateCommand(KeyUpEventHandler);
}
public void KeyUpEventHandler()
{
//This logic can be changed
if (Alphabets == "A")
{
// Perform some action
}
if (Alphabets == "B")
{
// Perform some other action
}
}
Любые идеи / предложения, как я могу справиться с этим?
2 ответа
Тип свойства команды должен быть DelegateCommand<KeyEventArgs>
:
public DelegateCommand<KeyEventArgs> KeyUpEventCommand { get; private set; }
private string strAlphabet;
public string Alphabets
{
get { return strAlphabet; }
set { SetProperty(ref strAlphabet, value); }
}
public MainWindowViewModel(IEventAggregator eventAggregator)
{
KeyUpEventCommand = new DelegateCommand<KeyEventArgs>(KeyUpEventHandler);
}
public void KeyUpEventHandler(KeyEventArgs args)
{
//...
}
Также убедитесь, что вы используете собственную призму InvokeCommandAction
класс и не устанавливайте CommandParameter
Свойство этого:
xmlns:prism="http://prismlibrary.com/"
...
<i:Interaction.Triggers >
<i:EventTrigger EventName="PreviewKeyDown">
<prism:InvokeCommandAction Command="{Binding KeyUpEventCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Тогда KeyEventArgs
должен быть передан в качестве параметра команды по умолчанию.
Попробуйте KeyTriger
<i:Interaction.Triggers>
<ei:KeyTrigger Key="Escape">
<i:InvokeCommandAction Command="{Binding KeyDownCommand}" />
</ei:KeyTrigger>
</i:Interaction.Triggers>
public ICommand KeyDownCommand
{
get { return new RelayCommand(KeyboardKeyDownCommand, true); }
}
private void KeyboardKeyDownCommand()
{
///code
}