【发布时间】:2009-10-17 01:28:33
【问题描述】:
我需要在 ContextMenu 中显示不同的选项,具体取决于右键单击 WPF DataGrid 的哪一行。我最初的想法是通过绑定或处理鼠标单击事件来实现这一点,但到目前为止,这两种策略都没有成功。任何帮助将不胜感激!
谢谢!
丹尼斯
【问题讨论】:
标签: wpf datagrid contextmenu row right-click
我需要在 ContextMenu 中显示不同的选项,具体取决于右键单击 WPF DataGrid 的哪一行。我最初的想法是通过绑定或处理鼠标单击事件来实现这一点,但到目前为止,这两种策略都没有成功。任何帮助将不胜感激!
谢谢!
丹尼斯
【问题讨论】:
标签: wpf datagrid contextmenu row right-click
您可以处理 DataGrid 的 ContextMenuOpening 事件,并根据路由事件的原始源调整上下文菜单。
下面是一个示例,如果原始源的数据上下文是 Inventory 类型,我将显示上下文菜单,否则我不会通过处理事件来显示上下文菜单。
Private Sub InventoriesDataGrid_ContextMenuOpening( _
ByVal sender As Object, _
ByVal e As System.Windows.Controls.ContextMenuEventArgs) Handles _
InventoriesDataGrid.ContextMenuOpening
Dim context = DirectCast(e.OriginalSource, System.Windows.FrameworkElement).DataContext
If TypeOf context Is Inventory Then
InventoriesDataGrid.ContextMenu = InventoriesDataGrid.Resources("DefaultContextMenu")
Else
e.Handled = True 'Do not show context menu.
End If
End Sub
我确定现在帮助您为时已晚,但万一现在还为时不晚,对于遇到此问题的其他人来说。
【讨论】:
您可以从 ContextMenuOpening 事件中的 ContextMenuEventArgs 参数中尝试 OriginalSource:
DataGridResults.ContextMenuOpening += (sender, args) =>
{
var frameworkElement = args.OriginalSource as FrameworkElement;
var gridRow = frameworkElement != null ? frameworkElement.TemplatedParent as DataGridRow : null;
}
但请注意,TemplatedParent 的使用取决于数据网格项的绑定方式
【讨论】: