如何在WPF中获取ContextMenu发起的事件的来源?

时间:2009-04-09 19:49:02

标签: .net wpf treeview contextmenu

我有一个带有Click事件的ContextMenu的TreeView。当上下文菜单中的click事件触发时,我明显将MenuItem作为事件的来源。如何获取TreeView中哪个节点是触发ContextMenu的节点?

3 个答案:

答案 0 :(得分:2)

或者,如果您使用的是RoutedUICommands,则可以使用OriginalSourceExecuteRoutedEventArgs上的CanExecuteRoutedEventArgs媒体资源查找FrameworkElement Command开始泡沫了。

OriginalSource可能是内部TextBlock或节点的DataTemplate中的其他元素,因此您需要使用VisualTreeHelper来查找所需的父级。我已经实现了这个功能的包装器,类似于: http://www.hardcodet.net/2008/02/find-wpf-parent /

如果您想在大型应用程序中分离/集中命令逻辑,这种方法很有用。

答案 1 :(得分:2)

//必须有比这更好的方法...... TreeViewItem tvi =(((发送者为MenuItem).Parent为ContextMenu).Parent as Popup).PlacementTarget as TreeViewItem;

这有效,但为什么我不应该这样做?

答案 2 :(得分:1)

通常,您在ContextMenu的“弹出”事件中的私有类级变量中存储TreeView节点(例如弹出事件的源,可能是所选节点 - 在某种程度上取决于您的界面),然后在菜单的点击事件中引用该变量。