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

标签 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;
}

但此代码不会更新 View1ViewModel,因为在 Prism 框架 View 模型中, View 绑定(bind)是通过框架进行的。 我尝试使用交互,我将以下代码放在根 Grid 部分。

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

事件被触发,但由于没有 Command 参数,因此它为空。我需要传递一个命令参数,但不知道它应该是什么!

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

有什么想法/建议可以解决这个问题吗?

最佳答案

命令属性的类型应该是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默认情况下应作为命令参数传递。

关于c# - 如何在 WPF 中使用 Prism 6 处理 ViewModel 中的按键事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42210588/

相关文章:

c# - 读取 JPEG 元数据时出现问题(方向)

WPF接受没有焦点的输入

c# - 使用 MVVM 在运行时绑定(bind)失败

c# - 在代码中设置时 SelectedValue 不更新

c# - 从 Javascript 更改时,HiddenField.ValueChanged 事件未触发

c# - SQLite 标量函数返回类型始终为字符串?

c# - 线程正在退出

c# - 通用 Windows 应用上的 ViewModel (MVVM) 绑定(bind)页面

c# - 从控制台应用程序 exe 在 DLL 中启动 WPF 应用程序

xamarin - 我应该如何使用 Prism 和 Unity 构建一个 View 的多个实例,所有这些实例都具有非常相似的 ViewModel