2011-06-22 25 views
1

グループと呼ばれるIList型のリストがあり、各グループにはアイテムと呼ばれる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(パンダ)

...

また、上記のスタイルは、さらなる補正が必要です。エキスパンダーのボーダー側を選択すると、選択されたイベントがトリガーされます。これは防止する必要があります。

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

あなたの問題を詳しく説明してください。私はもっと知りたいですか?