2011-06-22 85 views
1

我有一个称为组的IList类型的列表,每个组都有一个名为Items的IList子列表。 Group和Item都具有名为Name的属性。要显示这个层次结构,我使用了一个TreeView。WPF TreeView - 组节点样式

我想在层次结构中显示每个组作为扩展器,但它不显示为我想要的。

到目前为止,我的XAML:

<DataTemplate x:Key="NavItemTemplate"> 
    <TextBlock Text="{Binding Name}"/> 
</DataTemplate> 

<HierarchicalDataTemplate x:Key="NavGroupTemplate" ItemsSource="{Binding Items}" ItemTemplate="{StaticResource NavItemTemplate}"> 
    <TextBlock Text="{Binding Name}"/> 
</HierarchicalDataTemplate> 

<Style x:Key="RootItemStyle" TargetType="{x:Type TreeViewItem}"> 
<Setter Property="IsExpanded" Value="True"/> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="TreeViewItem"> 
      <Grid> 
       <Expander x:Name="Exp" TextElement.FontWeight="Bold" IsExpanded="{TemplateBinding TreeViewItem.IsExpanded}"> 
        <Expander.Header> 
         <ContentPresenter x:Name="ExpCP" ContentSource="Header"/> 
        </Expander.Header> 
        <ItemsPresenter/> 
       </Expander> 

       <Border x:Name="CP" Padding="25,0,0,0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Visibility="Collapsed"> 
        <ContentPresenter ContentSource="Header" HorizontalAlignment="Left" VerticalAlignment="Center" /> 
       </Border> 
      </Grid> 

      <ControlTemplate.Triggers> 
       <Trigger Property="HasItems" Value="false"> 
        <Setter TargetName="Exp" Property="Visibility" Value="Collapsed"/> 
        <Setter TargetName="CP" Property="Visibility" Value="Visible" /> 
       </Trigger> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="Red"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

<TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource NavGroupTemplate}" ItemContainerStyle="{StaticResource RootItemStyle}"> 

上面的样式

的作品:

组别1(扩展)

  • 项目1

组2(扩展)

...

但对(目标)不工作:

组别1(扩展)

  • 项目1

    • 的SubItem1

组2(扩展)

...

而且上面的样式还需要进一步修正。当我选择扩展器边界时,它会触发一个应该被阻止的selecteditem事件。

+0

我有类似的问题。我收集按年份和月份分组的日期。 IsExpanded属性设置为true时,是否可以将整个路径扩展到日期? –

回答

0

,如果你不指定在HierarchicalDataTemplate一个ItemTemplate(左旁加入到实际看到的树层次结构),它的工作原理:

<Grid> 
    <Grid.Resources> 
     <HierarchicalDataTemplate x:Key="NavGroupTemplate" ItemsSource="{Binding Items}"> 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 

     <Style x:Key="RootItemStyle" TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="True"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="TreeViewItem"> 
         <Grid Margin="16 0 0 0"> 
          <Expander x:Name="Exp" TextElement.FontWeight="Bold" IsExpanded="{TemplateBinding TreeViewItem.IsExpanded}"> 
           <Expander.Header> 
            <ContentPresenter x:Name="ExpCP" ContentSource="Header"/> 
           </Expander.Header> 
           <ItemsPresenter/> 
          </Expander> 

          <Border x:Name="CP" Padding="25,0,0,0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Visibility="Collapsed"> 
           <ContentPresenter ContentSource="Header" HorizontalAlignment="Left" VerticalAlignment="Center" /> 
          </Border> 
         </Grid> 

         <ControlTemplate.Triggers> 
          <Trigger Property="HasItems" Value="false"> 
           <Setter TargetName="Exp" Property="Visibility" Value="Collapsed"/> 
           <Setter TargetName="CP" Property="Visibility" Value="Visible" /> 
          </Trigger> 
          <Trigger Property="IsSelected" Value="True"> 
           <Setter Property="Background" Value="Red"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Grid.Resources> 

    <TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource NavGroupTemplate}" ItemContainerStyle="{StaticResource RootItemStyle}"> 
    </TreeView> 
</Grid> 
0

我做了类似的事情前一段时间,但是这是一个XmlDataProvider (不完全是你的IList情景)。希望它有一点帮助。

<XmlDataProvider x:Key="MenuDataProvider" XPath="*"> 
      <x:XData> 
       <MainMenu xmlns=""> 
        <Admin> 
         <Facility> 
          <Test/> 
         </Facility> 
         <Carpark /> 
        </Admin> 

        <Sequence> 
         <Lcd /> 
        </Sequence> 
       </MainMenu> 
      </x:XData> 
     </XmlDataProvider> 

     <HierarchicalDataTemplate x:Key="NodeTemplate"> 

      <TextBlock x:Name="tb" /> 

      <HierarchicalDataTemplate.ItemsSource> 
       <Binding XPath="child::node()" /> 
      </HierarchicalDataTemplate.ItemsSource> 

      <HierarchicalDataTemplate.Triggers> 

       <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
        <Setter TargetName="tb" Property="Text" Value="{Binding Path=Value}"></Setter> 
       </DataTrigger> 

       <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
        <Setter TargetName="tb" Property="Text" Value="{Binding Path=Name}"></Setter> 
       </DataTrigger> 
      </HierarchicalDataTemplate.Triggers> 
    </HierarchicalDataTemplate> 

它看起来像:

enter image description here

0

你的代码是为我工作的罚款。我刚刚删除了不必要的代码,为子元素添加了余量,并将其更改为仅加粗的组元素。

<HierarchicalDataTemplate x:Key="NavGroupTemplate" ItemsSource="{Binding Items}"> 
      <TextBlock Text="{Binding Name}" /> 
     </HierarchicalDataTemplate> 
     <Style x:Key="RootItemStyle" TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="True"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="TreeViewItem"> 
         <Grid> 
          <Expander x:Name="Exp" IsExpanded="{TemplateBinding TreeViewItem.IsExpanded}"> 
           <Expander.Header> 
            <ContentPresenter x:Name="ExpCP" ContentSource="Header" TextElement.FontWeight="Bold" /> 
           </Expander.Header> 
           <ItemsPresenter /> 
          </Expander> 
          <Border x:Name="CP" Padding="35,0,0,0" Background="{TemplateBinding Background}" Visibility="Collapsed"> 
           <ContentPresenter ContentSource="Header" HorizontalAlignment="Left" VerticalAlignment="Center" /> 
          </Border> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="HasItems" Value="false"> 
           <Setter TargetName="Exp" Property="Visibility" Value="Collapsed"/> 
           <Setter TargetName="CP" Property="Visibility" Value="Visible" /> 
          </Trigger> 
          <Trigger Property="IsSelected" Value="True"> 
           <Setter Property="Background" Value="Red"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
<TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource NavGroupTemplate}" ItemContainerStyle="{StaticResource RootItemStyle}"> 
     </TreeView> 

请问您能详细描述一下您的问题,我可以有更多的想法吗?