WPF TreeViewItem ContextMenu

时间:2014-05-03 01:14:06

标签: wpf treeview contextmenu treeviewitem

关于将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);
        }
    }

1 个答案:

答案 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">