关于将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为null。
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);
}
}
答案 0 :(得分:0)
从MenuItem向上遍历Visual和Logical树似乎表明TreeViewItem和MenuItem不在同一棵树中,尽管上面的XAML似乎表明了这一点。
至少在Click事件处理程序运行时,MenuItem所在的Logical和Visual树的根是PopupRoot。
这回答了我为什么我的参考不起作用的问题。
在我的情况下,我不需要在XAML中创建ContextMenu我打算在代码中创建Context菜单和树节点。 在这种情况下没有问题,我直接分配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">