2017-02-13 10 views
1

У меня есть ситуация, когда мне нужно обрабатывать событие нажатия клавиши, это может быть любой из A-Z, 0-9, но мне нужно обработать это в ViewModel. Какой ключ нажат, следует пропускать через ViewModel. Я использую призму 6.0, поэтому View1ViewModel автоматически связан с представлением1.Как обрабатывать событие нажатия клавиши в ViewModel с использованием Prism 6 в WPF?

Я знаю, что для определенных ключей я могу справиться, но как сделать то же самое для всех ключей.

У меня есть свойство в ViewModel «Keypressed», и я попытался следующий код в код-за

private void Window_PreviewKeyUp(object sender, KeyEventArgs e) 
{ 
    _mainWindowViewModel.KeyPressed = e.Key; 
} 

Но этот код не обновляет View1ViewModel как в Prism рамочным ViewModel и просматривать связывание через рамки. Я попытался использовать взаимодействие, я поставил ниже код в корневой каталог Grid.

<i:Interaction.Triggers > 
    <i:EventTrigger EventName="KeyUp"> 
     <i:InvokeCommandAction Command="{Binding KeyUpEventCommand}" 
     CommandParameter="..."/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Событие активируется, но поскольку параметр команды отсутствует, его значение равно нулю. Мне нужно передать commandParameter, но не знаю, что это должно быть!

В 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 
    } 
} 

Любые идеи/предложения, как я могу справиться с этим?

+0

Что именно "не обновлять View1ViewModel" означает? Что происходит? Возникает ли обработчик события PreviewKeyUp, но не задан или нет какой-либо установщик свойства KeyPressed модели представления? – mm8

+0

Я обновил свой вопрос, KeyUpEventCommand уволен, но он не содержит значения нажатия клавиши. – Debhere

+0

Как точно определяется класс KeyUpEventCommand в классе модели представления? – mm8

ответ

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 должен быть передан как параметр команды по умолчанию.

+0

Отлично !!! Это то, что мне нужно. Большое спасибо за ответ. Но можете ли вы дать какой-то свет, почему призма: InvokeCommandAction не срабатывает, если я использую какой-то другой ключ, скажем, что я нажимаю A сначала, тогда я хочу нажать B, затем C ... KeyUpEventCommand должен выполняться каждый раз, когда я нажимаю клавишу. Но этого не происходит. – Debhere

+1

Поскольку этот класс, являющийся частью Blend SDK, не поддерживает передачу EventArgs в команду. – mm8

+0

Спасибо, его работа. – Debhere

0

Попробуйте 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 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^