【问题标题】:Run a command when responding to an event响应事件时运行命令
【发布时间】:2013-03-25 11:59:02
【问题描述】:

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

我知道我可以很容易地将按钮链接到我的命令,只需将其绑定到 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 light 的建议(我通过 NuGet 添加)并找到了 here 的步骤,理论上很好,但我收到以下错误:

无法加载文件或程序集 'GalaSoft.MvvmLight.Extras.WPF4, PublicKeyToken=1673db7d5906b0ad' 或其依赖项之一。这 系统找不到指定的文件。

这是我添加到 DataGrid 中的 XAML:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="KeyUp">
        <command:EventToCommand Command="{Binding DownArrowRepeatsStakesCommand, Mode=OneWay}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

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

我还收到以下两个警告:

  • 无法将“EventTrigger”类型的实例添加到“TriggerCollection”类型的集合中。只允许使用“T”类型的项目。
  • “EventTrigger”类型的值无法添加到“TriggerCollection”类型的集合或字典中。

有点困惑!

有什么方法可以做我在命令中尝试做的事情,或者它是唯一选项的代码隐藏?

谢谢

【问题讨论】:

    标签: wpf xaml events mvvm command


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这在理论上看起来很棒,但在实践中并没有那么好,我已经更新了我的问题,说明出了什么问题,也许你可能会看到我没有看到的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2021-10-07
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多