2009-02-06 8 views
3

Je rencontre des problèmes lors de la modification du DataTemplate utilisé pour TreeViewItem lorsqu'il est sélectionné. Idéalement, je voudrais que chaque élément contienne un TextBlock, puis, lorsqu'il est sélectionné, il doit contenir un TextBox à la place.Modification du modèle d'un TreeViewItem lorsqu'il est sélectionné

Voici ce que j'ai jusqu'à présent (je this question comme point de départ):

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

Ce qui se passe est qu'il n'y a qu'un seul nœud de l'arbre, et le texte du nœud est le type nom de l'objet. Il semble que le type lié au nœud ne correspond pas à ce que le modèle attend, il utilise donc la liaison par défaut ToString() au lieu de la propriété Text comme indiqué.

J'ai défini le DataContext de la fenêtre dans le code derrière le fichier. Je sais que mes liaisons pour les données sont correctes, parce que si je définis un HierarchicalDataTemplate pour le TreeView les données sont affichées correctement.

Je pense que mon problème est que j'ai besoin de définir une propriété autre que ItemTemplate dans les styles TreeViewItem - est-ce que j'utilise la bonne propriété, ou devrais-je définir quelque chose d'autre?

+0

Typo dans le XAML: "HierarchialDataTemplate" devrait être « HierarchicalDataTemplate ". –

+0

@MarkMiller fixe - merci! – Andy

Répondre

2

C'est en fait le HeaderTemplate dont vous avez besoin - c'est ce qui régit le style du nœud lui-même. Juste donc il y a un échantillon complet, voici ce qui a fonctionné pour moi:

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

.. avec un code de test derrière comme celui-ci:

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

Cela a fonctionné - je ne sais pas comment j'ai raté la propriété HeaderTemplate. Et bien. Merci beaucoup! :) – Andy

+0

pourquoi diable c'est headertemplate ??? – GorillaApe

Questions connexes