在其他关于将ContextMenu放在TreeView元素上的问题/答案中,我总是看到对TreeView.ItemTemplate的引用。当你想为所有的项目使用相同的菜单时,这是很棒的,如果我只想让一个TreeViewItem有一个上下文菜单呢?我想这样就可以了:
<TreeViewItem>
<TreeViewItem.ContextMenu>
<ContextMenu>
<MenuItem Header="Remove This" Click="RemoveRecorder_Click"
DataContext="{Binding RelativeSource={RelativeSource
Mode=FindAncestor,AncestorType=TreeViewItem}}"/>
</ContextMenu>
</TreeViewItem.ContextMenu>
</TreeViewItem>但是当我在RemoveRecorder_Click中查看DataContext时,DataContext是空的。
private void RemoveRecorder_Click(object sender, RoutedEventArgs e)
{
if ((sender as MenuItem).DataContext is TreeViewItem)
{
TreeViewItem tvi = (sender as MenuItem).DataContext as TreeViewItem;
tvi.Parent.RemoveChild(tvi);
}
}发布于 2014-05-06 02:14:57
从MenuItem向上遍历视觉和逻辑树似乎表明,TreeViewItem和MenuItem并不在同一棵树中,尽管上面的XAML似乎暗示了这一点。
至少在click事件处理程序运行时,MenuItem所在的逻辑树和视觉树的根都是PopupRoot。
这回答了我的问题,为什么我的参考不起作用。
在我的例子中,我不需要用XAML创建ContextMenu,我无论如何都要用代码创建上下文菜单和树节点。在这种情况下没有问题,我直接分配DataContext:
MenuItem mu = new MenuItem();
mu.Header = "Remove Node";
mu.Click += RemoveRecorder_Click;
mu.DataContext = RemovableNode;
ContextMenu cu = new ContextMenu();
cu.Items.Add(mu);
RemovableNode.ContextMenu = cu;RemovableNode是:
<TreeViewItem Header="ITEM 1" IsExpanded="False" Name="RemovableNode">https://stackoverflow.com/questions/23439142
复制相似问题