问题描述
我们正在构建一个包含 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
绑定到父窗口的 DataContext
的 RelativeSource
:
Command="{Binding DataContext.ShowDetailsCommand,RelativeSource={RelativeSource AncestorType=Window}}"