Как обработать событие нажатия клавиши во 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
    }
Другие вопросы по тегам