我有一个带有 Click 事件的 ContextMenu 的 TreeView。当上下文菜单中的单击事件触发时,显然我将 MenuItem 作为事件源。如何获取 TreeView 中的哪个节点是触发 ContextMenu 的节点?
3 回答
或者,如果您正在使用,RoutedUICommands
您可以使用该OriginalSource
属性ExecuteRoutedEventArgs
并CanExecuteRoutedEventArgs
找到它的气泡开始的FrameworkElement
位置。Command
然而OriginalSource
,可能是内部 TextBlock,或节点的 DataTemplate 中的其他元素,因此您需要使用 VisualTreeHelper 来查找所需的父级。我已经围绕这个功能实现了一个类似于:
http ://www.hardcodet.net/2008/02/find-wpf-parent /
如果您想在大型应用程序中分离/集中您的命令逻辑,这种方法很好。
//必须有比这更好的方法... TreeViewItem tvi = (((sender as MenuItem).Parent as ContextMenu).Parent as Popup).PlacementTarget as TreeViewItem;
这行得通,但为什么我不应该这样做呢?
通常,您将 TreeView 节点(例如弹出事件的源,可能是所选节点 - 在某种程度上取决于您的界面)存储在 ContextMenu 的“弹出”事件中的私有类级变量中,然后参考菜单的点击事件中的那个变量。