如何在WPF中使用Prism 6处理ViewModel中的按键事件?

时间:2017-02-13 18:04:44

标签: c# wpf mvvm prism-6

我有一种需要处理按键事件的情况,它可以是A-Z,0-9中的任何一种,但我需要在ViewModel中处理它。按下哪个键应该通过ViewModel传递。我正在使用prism 6.0,因此View1ViewModel与view1自动连接。

我知道对于我可以处理的特定键,但是如何对所有键执行相同操作。

我在ViewModel" KeyPressed"中有一个属性,我在代码隐藏中尝试了以下代码

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

但是这段代码不像Prism框架视图模型那样更新View1ViewModel,而视图绑定是通过框架实现的。 我尝试使用交互,我将以下代码放在根Grid部分。

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

事件被触发,但因为没有Command参数所以它为null。我需要传递一个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
     }
}

任何想法/建议我该如何处理?

2 个答案:

答案 0 :(得分:3)

命令属性的类型应为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)
{
    //...
}

还要确保您使用的是Prism自己的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应作为命令参数传递。

答案 1 :(得分: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
    }