Treeview上的上下文菜单

时间:2015-05-13 08:36:37

标签: c# wpf xaml

如何在树视图的DataTrigger中设置上下文菜单?下面的代码不会触发上下文菜单,例如我也想要“符号”上的菜单。虽然我在HierarchicalDataTemplate上有一个上下文菜单,但它只能在子元素上运行。树视图上的根没有菜单

<HierarchicalDataTemplate x:Key="NameTemplate" ItemsSource="{Binding Path=ChildPlanner}">
  <HierarchicalDataTemplate.ItemContainerStyle>
      <Style>
          <Style.Triggers>
             <DataTrigger Binding="{Binding IsFolder}" Value="True">
                <Setter Property="TreeViewItem.ContextMenu" Value="{StaticResource AddNewSymbol}"/>
            </DataTrigger>
          </Style.Triggers>
      </Style>
  </HierarchicalDataTemplate.ItemContainerStyle>
  <StackPanel Orientation="Horizontal" Margin="2">
     <TextBlock Text="{Binding Path=Name}" FontWeight="Bold">
     </TextBlock>
  </StackPanel>
</HierarchicalDataTemplate>

<TreeView Name="SymbolsTreeView">
   <TreeView.ItemContainerStyle>
      <Style TargetType="{x:Type TreeViewItem}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding IsFolder}" Value="True">
               <Setter Property="ContextMenu" Value="{StaticResource AddNewSymbol}"/>
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </TreeView.ItemContainerStyle>
   <TreeViewItem Header="Symbols" IsExpanded="True" ItemsSource="{Binding PlannerTreeList}" ItemTemplate="{StaticResource NameTemplate}"/>
</TreeView>

想象一下我的树

Symbols
  Current
    Menu1Folder
    Menu2Folder
      Menu2Item
      Menu2AnotherItem
    Current1Item

HierarchicalDataTemplate的菜单适用于menu1文件夹以后即可。但我希望它适用于Current1Item,Current和Symbols。由于Current1Item不是文件夹,因此不应该有菜单,但Current和Symbols是文件夹

<TreeView.Resources>
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="ContextMenu" Value="{StaticResource AddNewSymbol}"/>
    <Style.Triggers>
      <DataTrigger Binding="{Binding IsFolder,RelativeSource={RelativeSource Self}}" Value="False">
          <Setter Property="ContextMenu" Value="{x:Null}"/>
       </DataTrigger>                                
    </Style.Triggers>
 </Style>
</TreeView.Resources>

1 个答案:

答案 0 :(得分:2)

编辑 - 试试这个新代码。我正在使用转换器根据您的属性显示和隐藏上下文菜单。它适用于我的示例代码。如果您需要我的示例代码,请告诉我。

 <Grid>
    <Grid.Resources>
        <BooleanToVisibilityConverter x:Key="VisibilityConverter" />
        <ContextMenu x:Key="MenuOne" Visibility="{Binding IsFolder,Converter={StaticResource VisibilityConverter}}">
            <MenuItem Header="Add Folder" Command="{Binding AddFolderCommand}"/>
            <MenuItem Header="Add Item" Command="{Binding AddItemCommand}"/>
        </ContextMenu>
    </Grid.Resources>
    <TreeView Name="SymbolsTreeView" ItemsSource="{Binding Items}">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:MyTreeViewItem}" ItemsSource="{Binding Items}">
                <ContentControl>

                <TextBlock Text="{Binding Name}"/>
                </ContentControl>

            </HierarchicalDataTemplate>
            <Style TargetType="TreeViewItem">
                <Setter Property="ContextMenu" Value="{StaticResource MenuOne}"/>
                <Setter Property="IsExpanded" Value="True"/>
            </Style>
        </TreeView.Resources>
    </TreeView>
</Grid>