为什么这个 DataGrid 鼠标输入绑定在一个项目中有效,而在另一个项目中却无效?
Why does this DataGrid mouse input binding work in one project, but not in another?
我们正在构建一个包含 DataGrid 的 WPF 应用程序,如果双击该行,该应用程序应该在当前选定的行上调用一个函数。我们的目标是尽可能采用 MVVM 方法,尽量避免事件。
因为我在以前的应用程序中为 DataGrid 做了类似的事情,所以我认为这会起作用:
<DataGrid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding ShowDetailsCommand}"/>
</DataGrid.InputBindings>
在此工作应用程序中,ShowDetailsCommand
指向一个方法,该方法通过数据绑定到 SelectedItem
来访问当前选定的 DataGrid 项。
在新项目中尝试同样的方法似乎根本不起作用。命令指向的方法永远不会被调用(使用断点和控制台输出进行测试),也没有关于在 DataContext 中找不到命令的错误消息。我们还尝试将 <InputBindings>
块直接移动到 Window 对象中,只是为了测试 DataContext 是否可能已经进一步向下更改,但双击仍然没有反应。
据我所知,这两个 DataGrid 之间的主要区别是:
- 旧的
ItemsSource
是手动绑定到对象集合,而新的绑定是通过在设计器中将 DataSet 拖到它上面创建的
- 旧项目的 DataContext 是一个单独的 ViewModel class,而新项目是 window 自己的代码隐藏 class(
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"
,声明于Window)
这两个原因中的任何一个都会导致 InputBinding 无法正常工作吗?如果没有,我们还有什么地方做错了吗?抱歉,如果信息不够,我只是不确定问题出在哪里。如果需要,我会尝试提供有关代码的更多信息。
尝试使用 RelativeSource
:
绑定到父 window 的 DataContext
的 ShowDetailsCommand
Command="{Binding DataContext.ShowDetailsCommand,
RelativeSource={RelativeSource AncestorType=Window}}"
我们正在构建一个包含 DataGrid 的 WPF 应用程序,如果双击该行,该应用程序应该在当前选定的行上调用一个函数。我们的目标是尽可能采用 MVVM 方法,尽量避免事件。
因为我在以前的应用程序中为 DataGrid 做了类似的事情,所以我认为这会起作用:
<DataGrid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding ShowDetailsCommand}"/>
</DataGrid.InputBindings>
在此工作应用程序中,ShowDetailsCommand
指向一个方法,该方法通过数据绑定到 SelectedItem
来访问当前选定的 DataGrid 项。
在新项目中尝试同样的方法似乎根本不起作用。命令指向的方法永远不会被调用(使用断点和控制台输出进行测试),也没有关于在 DataContext 中找不到命令的错误消息。我们还尝试将 <InputBindings>
块直接移动到 Window 对象中,只是为了测试 DataContext 是否可能已经进一步向下更改,但双击仍然没有反应。
据我所知,这两个 DataGrid 之间的主要区别是:
- 旧的
ItemsSource
是手动绑定到对象集合,而新的绑定是通过在设计器中将 DataSet 拖到它上面创建的 - 旧项目的 DataContext 是一个单独的 ViewModel class,而新项目是 window 自己的代码隐藏 class(
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"
,声明于Window)
这两个原因中的任何一个都会导致 InputBinding 无法正常工作吗?如果没有,我们还有什么地方做错了吗?抱歉,如果信息不够,我只是不确定问题出在哪里。如果需要,我会尝试提供有关代码的更多信息。
尝试使用 RelativeSource
:
DataContext
的 ShowDetailsCommand
Command="{Binding DataContext.ShowDetailsCommand,
RelativeSource={RelativeSource AncestorType=Window}}"