2015-05-13 4 views
0

Как я могу создать контекстное меню в DataTrigger в дереве? Приведенный ниже код не вызывает контекстное меню, например, я хочу, чтобы меню было также «Символы». Хотя у меня есть контекстное меню на HierarchicalDataTemplate, которое отлично работает, но только на дочерних элементах. Корень на TreeView не имеют менюКонтекстное меню в Treeview

<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 работает для menu1folder года, который нормально. Но я хочу, чтобы он работал для Current1Item, Current и Symbols. Поскольку Current1Item не папка, там не должно быть меню для него, но и тока Символы папки

<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> 
+0

У вас есть разные DataTemplates для разных типов объектов? – Krishna

+0

@ Кришна Да. У меня есть два отдельных источника. HierarchicalDataTemplate использует ChildPlannerList, а Treeview использует PlannerTreeList – user2837961

+0

Я все еще не уверен, как выглядит ваш макет. Но см. Мой ответ и дайте мне знать, если это поможет. В противном случае, пожалуйста, дайте дополнительную информацию об иерархии вашего дерева, и я (или кто-то еще) мог бы помочь – Krishna

ответ

2

Edit - Попробуйте этот новый код. Я использую конвертер для отображения и скрытия контекстного меню на основе вашего свойства. Он работает с моим примером кода. Дайте мне знать, если вы хотите, чтобы мой образец кода.

<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> 
Смежные вопросы