WPF:将 ContextMenu 添加到 TreeView

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20385367/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 10:09:59  来源:igfitidea点击:

WPF: Add ContextMenu to TreeView

c#wpftreeviewcontextmenu

提问by bas

For a second there I was proud that I finally managed to add a ContextMenuto a leaf in my TreeView, but then I realized it pops up on the wrong node.

有那么一瞬间,我很自豪我终于成功地ContextMenu在我的TreeView.

My XAML:

我的 XAML:

    <TreeView 
        Grid.Row="1" 
        Grid.Column="0"
        x:Name="TvShowsTreeView"
        ItemsSource="{Binding TvShows}"
        SelectedItemChanged="TvShowsTreeViewOnSelectedItemChanged">

        <!-- Season template -->
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Seasons}">
                <TextBlock Text="{Binding Name}">
                    <TextBlock.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Hide"></MenuItem>
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>

            </HierarchicalDataTemplate>

        </TreeView.ItemTemplate>
    </TreeView>

When I run this, I get a context menu on the TvShows, not on the Seasons.

当我运行它时,我TvShowsSeasons.

I am close, right? :) Who can help me further here?

我很接近,对吧?:) 谁能帮我更进一步?

回答by bas

The correct XAML should be like this:

正确的 XAML 应该是这样的:

    <TreeView 
        Grid.Row="1" 
        Grid.Column="0"
        x:Name="TvShowsTreeView"
        ItemsSource="{Binding TvShows}"
        SelectedItemChanged="TvShowsTreeViewOnSelectedItemChanged">

        <!-- TvShows template -->
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Seasons}">
                <TextBlock Text="{Binding Name}" />

                <!-- Seasons template -->
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate>
                        <TextBlock Text="{Binding Name}">
                            <TextBlock.ContextMenu>
                                <ContextMenu>
                                    <MenuItem Header="Hide"></MenuItem>
                                </ContextMenu>
                            </TextBlock.ContextMenu>
                        </TextBlock>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>

        </TreeView.ItemTemplate>
    </TreeView>

The additional HierarchicalDataTemplate specifies the template for Seasons, which itself does not need to bind ItemSource because it does not contain nodes.

附加的 HierarchicalDataTemplate 指定了 Seasons 的模板,它本身不需要绑定 ItemSource,因为它不包含节点。