1

this questionに続いて、TreeViewについて別の質問があります。'ItemTemplate'と 'ItemTemplateSelector'の両方が設定されています。 'ItemTemplateSelector'は無視されます

TreeViewHierarchicalDataTemplateで、レベル2のHierarchicalDataTemplateを変更できます(質問と回答で説明したように)。

今私が望むのは、Treeviewのエクスパンダの外観を変更することです。このために、私はctForTreeViewItemという名前ControlTemplateを定義している、と私はこのようにそれを使用します。予想通り

<Window.Resources> 
    <ControlTemplate x:Key="ctForTreeViewItem" 
        TargetType="{x:Type TreeViewItem}"> 
     <Expander IsExpanded="True" 
        Background="Grey" 
        BorderBrush="Transparent" 
        Foreground="White" 
        BorderThickness="1,1,1,3"> 
      <Expander.Header> 
       <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
         Padding="{TemplateBinding Control.Padding}" 
         BorderBrush="{TemplateBinding Border.BorderBrush}" 
         Background="{TemplateBinding Panel.Background}" 
         Name="Bd" 
         SnapsToDevicePixels="True" 
         Grid.Column="1"> 
        <ContentPresenter Content="{TemplateBinding HeaderedContentControl.Header}" 
             ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}" 
             ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}" 
             ContentSource="Header" 
             Name="PART_Header" 
             HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
             SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> 
       </Border> 
      </Expander.Header> 

      <Expander.Content> 
       <ItemsPresenter x:Name="ItemsHost" /> 
      </Expander.Content> 

     </Expander> 
    </ControlTemplate> 

    <DataTemplate x:Key="Level3Template"> 
     <Border Background="LightBlue"> 
      <TextBlock Text="Level3"/> 
     </Border> 
    </DataTemplate> 

    <HierarchicalDataTemplate x:Key="Level2RedTemplate" 
          ItemsSource="{Binding Value}" 
          ItemTemplate="{StaticResource Level3Template}"> 
     <Border Background="Red"> 
      <TextBlock Text="Level2"/> 
     </Border> 
    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate x:Key="Level2YellowTemplate" 
          ItemsSource="{Binding Value}" 
          ItemTemplate="{StaticResource Level3Template}"> 
     <Border Background="Yellow"> 
      <TextBlock Text="Level2"/> 
    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate x:Key="Level1Template" 
          ItemsSource="{Binding Value}" 
          ItemTemplateSelector="{StaticResource MySelector}"> 

     <HierarchicalDataTemplate.ItemContainerStyle> 
      <Style TargetType="TreeViewItem"> 
       <Setter Property="Template" 
         Value="{StaticResource ctForTreeViewItem}" /> 
      </Style> 
     </HierarchicalDataTemplate.ItemContainerStyle> 

     <Border Background="Green"> 
      <TextBlock Text="Level1"/> 
     </Border> 
    </HierarchicalDataTemplate> 
</Window.Resources> 

<TreeView Grid.Row="1" 
      Name="tv" 
      ItemsSource="{Binding Items}" 
      ItemTemplate="{StaticResource Level1Template}"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="Template" 
        Value="{StaticResource ctForTreeViewItem}" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

これは、レベル1のために働くので、レベル1に、私が定義されControlTemplateと正しいHierarchicalDataTemplateTreeViewItemsを持っています。

しかし、レベル2では、私はItemTemplateSelectorを持っています。この位置で、私はこのエラーを取得する:System.Windows.Data Error: 25 : Both 'ItemTemplate' and 'ItemTemplateSelector' are set; 'ItemTemplateSelector' will be ignored.

  • ItemTemplateSelectorを維持しながら、私は、TreeViewItem秒にControlTemplateを割り当てることができる任意の方法は、ありますか?またはさらに

  • 私はTreeViewのエクスパンダのスタイルを変更することができます他の方法はありますか?

+0

あなたはツリービューアイテムでItemTemplateSelectorを設定しようとしたことがありあなたのHierarchicalDataTemplateのスタイル? –

+0

それはどういう意味ですか?それは私が(私が上で説明したように)同時にそれらを使用することができないことを意味しますか? – Yvonnila

+0

@EdPlunkettはい、level1で 'ItemTemplateSelector'も移動しました。 'TreeView'の' ItemContainerStyle'の 'Template'を定義すると、私は同じエラーが発生しました。 – Yvonnila

答えて

1

TreeViewItem ControlTemplateが壊れています。 explicitly override that by setting ContentTemplate on the ContentPresenterなので、データテンプレートセレクタは無視されます。これは、デバッグ出力ストリームの(無害な)エラーを引き起こすのと同様です。レベル2のテンプレートは、同じようにItemContainerStyleTreeViewに設定すると、すべての子によって継承されるように、先祖からItemTemplateSelectorを継承しますいくつかの介入する子が明示的にそれを上書きしない限り。何度も設定する必要はありません。レベル2のテンプレートはItemTemplateSelectorを継承し、それを別のプロパティで上書きするため、エラーが発生しますが、無害です。

私は、デフォルトのツリービューアイテムのコントロールテンプレートに合わせて、ヘッダーのためのContentPresenterを変更することにより、コントロールテンプレートを固定:私はContentTemplateContentを除去し、ContentStringFormat属性。 ContentPresenterには、すべてのもののデフォルトの動作があるため、明示的に指定する必要はありません。

<ContentPresenter 
    ContentSource="Header" 
    Name="PART_Header" 
    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
    /> 

テンプレート/テンプレートセレクタエラーは無害ですが、私はレベルにnullに明示的に2階層データテンプレートをItemTemplateSelectorを設定することで、それらを黙らせることができた:

<HierarchicalDataTemplate 
    x:Key="Level2RedTemplate" 
    ItemsSource="{Binding Value}" 
    ItemTemplateSelector="{x:Null}" 
    ItemTemplate="{StaticResource Level3Template}" 
    > 
    <Border Background="Red"> 
     <TextBlock Text="Level2"/> 
    </Border> 
</HierarchicalDataTemplate> 
+0

うわー、それは完璧な説明と完璧な答えでした!ありがとうございました!あなたの答えは、私をずっとずっと引き寄せました。私はちょうどほんの数ステップで私が欲しいものを手に入れることができると思う。 – Yvonnila

関連する問題