MVVM Light通过CommandParameter传递按下的键

本文关键字:Light 通过 CommandParameter MVVM | 更新日期: 2023-09-27 18:01:28

我想知道是否有办法通过CommandParameter将按下的键传递给我的动作。我想知道在动作被允许执行之前按了哪个键

这是我的XAML
<i:Interaction.Triggers>
    <i:EventTrigger EventName="KeyDown">
        <i:InvokeCommandAction Command="{Binding Path=ParseCommand}" CommandParameter=""/>
    </i:EventTrigger>
</i:Interaction.Triggers>
我ViewModel

public class MainViewModel : ViewModelBase
{
    public RelayCommand<EventArgs> ParseCommand { get; set; }
    public MainViewModel()
    {
        this.ParseCommand = new RelayCommand<EventArgs>(ParseLineExecute, CanParseLine);
    }
    public bool CanParseLine(EventArgs e)
    {
        return true;
    }
    public void ParseLineExecute(EventArgs e)
    {
        //something to do
    }
}

如果这是不可能的,有什么更好的方法?如果可能的话,我不想从MVVM Light中移出

MVVM Light通过CommandParameter传递按下的键

问题解决了。我要做的是添加以下命名空间:

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP8"

和从:

切换
<i:EventTrigger EventName="KeyDown">
    <i:InvokeCommandAction Command="{Binding Path=ParseCommand}" CommandParameter=""/>
</i:EventTrigger>

:

<i:EventTrigger EventName="KeyDown">
    <cmd:EventToCommand Command="{Binding Path=ParseCommand}" PassEventArgsToCommand="True"/>
</i:EventTrigger>

这样,通过知道指定的事件(在本例中是"KeyDown"), PassEventArgsToCommand将把正确的参数传递给parseccommand。通过显式地将EventArgs转换为KeyEventArgs,我可以知道用户按了什么键。

这是我的视图模型:
public class MainViewModel : ViewModelBase
{
    public RelayCommand<EventArgs> ParseCommand { get; set; }
    public MainViewModel()
    {
        this.ParseCommand = new RelayCommand<EventArgs>(ParseLineExecute, CanParseLine);
    }
    public bool CanParseLine(EventArgs e)
    {
        var pressedKey = (e != null) ? (KeyEventArgs)e : null;
        if (pressedKey.Key == Key.Space && pressedKey != null)
        {
            return true;
        }
        else
        {
            return false;
        }       
    }
    public void ParseLineExecute(EventArgs e)
    {
        //parsing code
    }
}