响应事件时运行命令

时间:2013-04-03 17:11:35

标签: wpf xaml events mvvm command

基本上,我正在尝试响应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>

这是截图(没有内部异常):

Screenshot

我还收到以下两个警告:

  • 无法添加类型&#39; EventTrigger&#39;到类型&#39; TriggerCollection&#39;的集合。只有类型&#39; T&#39;是允许的。
  • 类型&#39; EventTrigger&#39;的值无法添加到&#39; TriggerCollection&#39;。
  • 类型的集合或词典中

有点困惑!

有没有办法在Command中做我想做的事情,或者代码背后的唯一选择?

由于

1 个答案:

答案 0 :(得分:3)

直接在WPF中不支持此功能。您需要一些额外的“粘合剂”,例如MVVM Light's EventToCommand实现,它允许您接收任何事件并将其映射到ViewModel中的ICommand