1

this question 다음에 나는 TreeView에 대한 다른 질문이 있습니다.'ItemTemplate'및 'ItemTemplateSelector'둘 다 설정됩니다. 'ItemTemplateSelector'이 무시됩니다

내가 가지고있는 것은 TreeViewHierarchicalDataTemplate이며 레벨 2의 HierarchicalDataTemplate을 변경할 수 있습니다 (질문과 답변에서 설명하는 것과 같습니다).

내가 지금 원하는 것은 Treeview의 확장기 모양을 변경하는 것입니다. 이를 위해, 나는 ControlTemplatectForTreeViewItem 이름을 정의하고, 나는이처럼 사용

예상대로이 레벨 1에 있도록, 레벨 1 작동
<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> 

, 나는 정의 ControlTemplate 및 올바른 HierarchicalDataTemplateTreeViewItems 있습니다.

그러나 Level2에는 작동하지 않습니다. 여기서 나는 ItemTemplateSelector입니다. System.Windows.Data Error: 25 : Both 'ItemTemplate' and 'ItemTemplateSelector' are set; 'ItemTemplateSelector' will be ignored.

  • 있는 방법은 ItemTemplateSelector을 유지하면서 내가는 TreeViewItem들에 ControlTemplate를 할당 할 수 있나요 :이 위치에서, 나는이 오류가? 또는 심지어

  • 다른 방법이 있습니까, 나는 TreeView의 확장기의 스타일을 변경할 수 있습니까?

+0

당신이 TreeViewItem에 ItemTemplateSelector 설정을 시도 유무 :

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

템플릿/템플릿 선택 오류

는 무해하지만 레벨 2 계층 적 데이터 템플릿을 null로 명시 적으로 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 템플릿은 ItemContainerStyle을 한 번 TreeView에 설정하면 모든 하위 항목에 상속되는 것과 동일한 방식으로 상위 객체에서 ItemTemplateSelector을 상속합니다 일부 개입하는 자식이 명시 적으로이를 오버라이드하지 않는 한 트리 뷰의 한 번 이상 설정할 필요가 없습니다. 레벨 2 템플릿은 ItemTemplateSelector을 상속하고 다른 속성으로 덮어 쓰기 때문에 오류가 발생하지만 무해합니다.

나는 기본 TreeViewItem 컨트롤 템플릿과 일치하도록 헤더의 ContentPresenter에 변경하여 컨트롤 템플릿을 고정 : 나는 Content, ContentTemplateContentStringFormat 특성을 제거했습니다. ContentPresenter에는 모든 내용에 대한 기본 동작이 있으므로 명시 적으로 지정하지 않아도됩니다.

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

와우, 그 완벽한 설명과 완벽한 답변을했습니다! 고맙습니다! 당신의 대답은 훨씬 더 많은 것을 가져 왔습니다. 나는 내가 원하는 것을 몇 단계 만 더 얻을 수 있다고 생각한다. – Yvonnila