MVVM Light通过CommandParameter传递按下的键

时间:2014-05-04 05:02:53

标签: c# windows-phone-8 mvvm

我想知道是否可以通过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转移

1 个答案:

答案 0 :(得分:1)

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

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>

这样,通过知道指定的事件(在这种情况下,&#34; KeyDown&#34;),PassEventArgsToCommand会将正确的参数传递给ParseCommand。通过明确地将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
    }
}