为什么此 DataGrid 鼠标输入绑定在一个项目中有效,而在另一个项目中无效?

问题描述

我们正在构建一个包含 DataGrid 的 WPF 应用程序,如果双击该行,它应该在当前选定的行上调用一个函数。我们的目标是尽可能采用 MVVM 方法,尽量避免发生事件。

因为我在以前的应用程序中为 DataGrid 做过类似的事情,我认为这会起作用:

<DataGrid.InputBindings>
    <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding ShowDetailsCommand}"/>
</DataGrid.InputBindings>

在此工作应用程序中,ShowDetailsCommand 指向一个方法,该方法通过与 SelectedItem 的数据绑定访问当前选定的 DataGrid 项。

在新项目中尝试这种相同的方法似乎根本不起作用。命令指向的方法永远不会被调用(使用断点和控制台输出进行测试),并且也没有关于在 DataContext 中找不到命令的错误消息。我们还尝试将 <InputBindings> 块直接移动到 Window 对象中,只是为了测试 DataContext 是否可能进一步向下更改,但双击仍然没有反应。

据我所知,两个 DataGrids 之间唯一的主要区别是:

  • 旧的 ItemsSource 手动绑定到对象集合,而新的 Binding 是通过在设计器中将 DataSet 拖到其上来创建的
  • 旧项目的 DataContext 是一个单独的 viewmodel 类,而新的是窗口自己的 Codebehind 类(DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}",在窗口上声明)

其中任何一个可能是 InputBinding 不起作用的原因吗?如果没有,我们还有什么可能做错的吗?抱歉,如果这不是足够的信息,我只是非常不确定问题可能出在哪里。如果需要,我会尝试提供有关代码的更多信息。

解决方法

尝试使用 ShowDetailsCommand 绑定到父窗口的 DataContextRelativeSource

Command="{Binding DataContext.ShowDetailsCommand,RelativeSource={RelativeSource AncestorType=Window}}"