基本上,我正在尝试响应WPF控件引发的事件,但不是使用代码隐藏,而是运行命令(ICommand)。
我有一个名为CouponView的窗口和一个名为SingleBetView的UserControl。我有一个名为CouponViewModel的ViewModel,它是CouponView的DataContext,以及一个名为BetsViewModel的ViewModel,它是SingleBetView的DataContext。我将SingleBetView添加到CouponView并设置它的DataContext,如下所示:
<View:SingleBetView DataContext="{Binding Path=BetsViewModel}" />
SingleBetView包含一个DataGrid,我想响应这个网格的KeyDown事件。我创建了一个名为DownArrowRepeatsStakesCommand的Command类,并将此实例放在BetsViewModel中,如下所示:
public DownArrowRepeatsStakesCommand DownArrowRepeatsStakesCommand { get; set; }
然后我在BetsViewModel的构造函数中实例化它,如下所示:
DownArrowRepeatsStakesCommand = new DownArrowRepeatsStakesCommand(_bets); //_bets is an observable collection, my DataGridView is bound to this ObservableCollection and when the KeyDown is pressed, I want to update various elements
我知道我可以轻松地将一个按钮链接到我的Command,只需将它绑定到ViewModel中的实例就像这样:
Command="{Binding DownArrowRepeatsStakesCommand}"
但是,对于回应事件似乎并不起作用:
KeyDown="{Binding DownArrowRepeatsStakesCommand}
我收到以下运行时错误:
A 'Binding' cannot be set on the 'AddKeyDownHandler' property of type 'DataGrid'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
我尝试了Reed建议使用MVVM灯(我通过NuGet添加)和找到的步骤here,理论上很棒,但我得到了以下错误:
无法加载文件或程序集&#39; GalaSoft.MvvmLight.Extras.WPF4, 公钥= 1673db7d5906b0ad&#39;或其中一个依赖项。该 系统找不到指定的文件。
这是我添加到DataGrid的XAML:
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyUp">
<command:EventToCommand Command="{Binding DownArrowRepeatsStakesCommand, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
这是截图(没有内部异常):
我还收到以下两个警告:
有点困惑!
有没有办法在Command中做我想做的事情,或者代码背后的唯一选择?
由于
答案 0 :(得分:3)
直接在WPF中不支持此功能。您需要一些额外的“粘合剂”,例如MVVM Light's EventToCommand实现,它允许您接收任何事件并将其映射到ViewModel中的ICommand
。