2009-02-06 3 views
3

TreeViewItem이 선택되었을 때 사용되는 DataTemplate을 변경하는 데 문제가 있습니다. 이상적으로는 각 항목에 TextBlock이 포함 된 다음 선택하면 TextBox이 포함되어야합니다. 여기 TreeViewItem이 선택되었을 때 템플릿 변경

내가 (나는 출발점으로 this question을 사용) 지금까지 무엇을 가지고 :

<Window> 
    <Window.Resources> 
     <HierarchicalDataTemplate x:Key="normal" 
      ItemsSource="{Binding Path=Children}"> 
      <TextBlock Text="{Binding Path=Text}" /> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate x:Key="selected" 
      ItemsSource="{Binding Path=Children}"> 
      <TextBox Text="{Binding Path=Text}" /> 
     </HierarchicalDataTemplate> 
     <Style TargetType="{x:Type TreeViewItem}" x:Key="ContainerStyle"> 
      <Setter Property="ItemTemplate" Value="{StaticResource normal}" /> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="ItemTemplate" Value="{StaticResource selected}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resource> 
    <Grid> 
     <TreeView ItemSource="{Binding Body}" ItemContainerStyle="{StaticResource ContainerStyle}" /> 
    </Grid> 
</Window> 

무슨 일이 트리의 하나 개의 노드이며, 노드의 텍스트 유형이라는 것이다 객체의 이름. 노드에 바인딩 된 유형이 템플리트가 예상하지 않는 것 같아서 지정된대로 Text 특성 대신 기본 ToString() 바인딩을 사용하고 있습니다.

코드 숨김 파일에서 Window의 DataContext를 설정했습니다. TreeView에 대해 하나의 HierarchicalDataTemplate을 설정하면 데이터가 올바르게 표시되므로 데이터에 대한 제 Bindings가 정확하다는 것을 알고 있습니다.

TreeViewItem 스타일에 ItemTemplate 이외의 속성을 설정해야한다고 생각합니다. 올바른 속성을 사용하고 있습니까? 아니면 다른 설정을해야합니까?

+0

오타 : "HierarchialDataTemplate는" "해야한다 HierarchicalDataTemplate ". –

+0

@MarkMiller 수정 - 고마워요! – Andy

답변

2

실제로 필요한 HeaderTemplate입니다. 이것이 노드 자체의 스타일을 관리합니다. 완전한 샘플이 그냥, 그래서 이것은 나를 위해 일한 것입니다 :

<Window x:Class="Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.Resources> 
    <HierarchicalDataTemplate x:Key="normal" 
          ItemsSource="{Binding Path=Children}"> 
     <TextBlock Text="{Binding Path=Text}" /> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="selected" 
          ItemsSource="{Binding Path=Children}"> 
     <TextBox Text="{Binding Path=Text}" /> 
    </HierarchicalDataTemplate> 
    <Style TargetType="{x:Type TreeViewItem}" 
      x:Key="ContainerStyle"> 
     <Setter Property="HeaderTemplate" 
       Value="{StaticResource normal}" /> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" 
        Value="True"> 
       <Setter Property="HeaderTemplate" 
         Value="{StaticResource selected}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
    </Window.Resources> 
    <Grid> 
     <TreeView x:Name="_Tree" ItemContainerStyle="{StaticResource ContainerStyle}"/> 
    </Grid> 
</Window> 

.. 이런 뒤에 몇 가지 테스트 코드 :

는 XAML에서
Imports System.Collections.ObjectModel 

Class Window1 

    Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded 

     Dim Root As New Node 
     Root.Text = "Root" 

     Dim Child As New Node 
     Child.Text = "Child" 
     Root.Children.Add(Child) 

     Dim Nodes As New Collection(Of Node) 
     Nodes.Add(Root) 
     _tree.itemssource = Nodes 

    End Sub 

End Class 

Public Class Node 

    Private _Text As String 
    Public Property Text() As String 
     Get 
      Return _Text 
     End Get 
     Set(ByVal Value As String) 
      _Text = Value 
     End Set 
    End Property 

    Private _Children As New Collection(Of Node) 
    Public Property Children() As Collection(of node) 
     Get 
      Return _Children 
     End Get 
     Set(ByVal Value As Collection(of node)) 
      _Children = Value 
     End Set 
    End Property 

End Class 
+0

그게 효과가있어 - 내가 어떻게 HeaderTemplate 속성을 놓쳤는 지 모르겠다. 아 ~. 고마워요! :) – Andy

+0

왜 지구상에 그것은 headertemplate ??? – GorillaApe

관련 문제