首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF TreeViewItem ContextMenu

WPF TreeViewItem ContextMenu
EN

Stack Overflow用户
提问于 2014-05-03 09:14:06
回答 1查看 520关注 0票数 0

在其他关于将ContextMenu放在TreeView元素上的问题/答案中,我总是看到对TreeView.ItemTemplate的引用。当你想为所有的项目使用相同的菜单时,这是很棒的,如果我只想让一个TreeViewItem有一个上下文菜单呢?我想这样就可以了:

代码语言:javascript
复制
    <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是空的。

代码语言:javascript
复制
    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);
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2014-05-06 02:14:57

从MenuItem向上遍历视觉和逻辑树似乎表明,TreeViewItem和MenuItem并不在同一棵树中,尽管上面的XAML似乎暗示了这一点。

至少在click事件处理程序运行时,MenuItem所在的逻辑树和视觉树的根都是PopupRoot。

这回答了我的问题,为什么我的参考不起作用。

在我的例子中,我不需要用XAML创建ContextMenu,我无论如何都要用代码创建上下文菜单和树节点。在这种情况下没有问题,我直接分配DataContext:

代码语言:javascript
复制
        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是:

代码语言:javascript
复制
<TreeViewItem Header="ITEM 1" IsExpanded="False" Name="RemovableNode">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23439142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档