如何为父节点和子节点添加不同的上下文菜单?

时间:2018-01-03 18:03:26

标签: wpf xaml treeview

我能够成功实现TreeView并将复杂数据绑定为ItemSource。我需要显示两个不同的上下文菜单。一个用于父节点,另一个用于子节点。我尝试了下面的代码,但它显示了所有节点的相同上下文菜单。

<TreeViewAdv Name="treeView" ShowRootLines="False" ItemsSource="{Binding TreeItems}">
<StackPanel Orientation="Horizontal">
                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Add"/>
                                <MenuItem Header="Run All"/>
                                <MenuItem Header="Stop"/>
                                <MenuItem Header="Collapse All"/>
                                <MenuItem Header="Expand All" />
                            </ContextMenu>
                        </StackPanel.ContextMenu>
                    </StackPanel>

//此上下文菜单仅显示所有节点

<TreeViewAdv.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding SubItems}">
                            <StackPanel Orientation="Horizontal">
                                <StackPanel.ContextMenu>
                                    <ContextMenu>
                                        <MenuItem Header="Record"/>
                                        <MenuItem Header="Run"/>
                                        <MenuItem Header="Delete" />
                                    </ContextMenu>
                                </StackPanel.ContextMenu>
                                <Rectangle Margin="0" Width="12" Height="12"/>
                                <TextBlock Margin="5 0" Text="{Binding Name}" VerticalAlignment="Center"/>
                            </StackPanel>
                        </HierarchicalDataTemplate>
                    </TreeViewAdv.ItemTemplate>
</TreeViewAdv>

请告诉我,如何单独显示父节点和子节点的不同上下文菜单?

enter image description here

由于

1 个答案:

答案 0 :(得分:0)

如果根项和叶项由不同的视图模型类支持,则可以包含由DataType选择的多个HierarchicalDataTemplates:

<TreeView>
<TreeView.Resources>
    <HierarchicalDataTemplate ItemsSource="{Binding SubItems}" DataType="{x:Type local:RootViewModel}">
        <StackPanel Orientation="Horizontal">
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Record"/>
                    <MenuItem Header="Run"/>
                    <MenuItem Header="Delete" />
                </ContextMenu>
            </StackPanel.ContextMenu>
            <Rectangle Margin="0" Width="12" Height="12"/>
            <TextBlock Margin="5 0" Text="{Binding Name}" VerticalAlignment="Center"/>
        </StackPanel>
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding SubItems}" DataType="{x:Type local:ItemViewModel}">
        <StackPanel Orientation="Horizontal">
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Jump"/>
                    <MenuItem Header="Sing"/>
                    <MenuItem Header="Doodle" />
                </ContextMenu>
            </StackPanel.ContextMenu>
            <Rectangle Margin="0" Width="12" Height="12"/>
            <TextBlock Margin="5 0" Text="{Binding Name}" VerticalAlignment="Center"/>
        </StackPanel>
    </HierarchicalDataTemplate>
</TreeView.Resources>

上面的示例假定这些类是 RootViewModel ItemViewModel