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