2010-08-18 3 views
3

J'essaye de lier récursivement aux enfants d'un élément dans un TreeView. D'après ce que je peux voir sur MSDN HierarchicalDataTemplate est le chemin à parcourir, mais jusqu'ici je n'ai que partiellement réussi.Liaison récursive dans un TreeView WPF

Ma classe:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DocumentText test = new DocumentText(); 
     this.DataContext = test; 

     for (int i = 1; i < 5; i++) 
     { 
      test.AddChild(); 
     } 
     foreach (DocumentText t in test.Children) 
     { 
      t.AddChild(); 
      t.AddChild(); 
     } 
    } 
} 

partial class DocumentText 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 

    public List<DocumentText> _children; 
    public List<DocumentText> Children 
    { 
     get { return this._children; } 
    } 

    public DocumentText() 
    { 
     _name = "Test"; 
     _children = new List<DocumentText>(); 
    } 

    public void AddChild() 
    { 
     _children.Add(new DocumentText()); 
    } 
} 

Mon XAML: En mainview.xaml:

<Window x:Class="treetest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TreeView Name="binderPanel" DockPanel.Dock="Left" 
         MinWidth="150" MaxWidth="250" Background="LightGray" 
         ItemsSource="{Binding Children}"> 
     </TreeView> 
    </Grid> 
</Window> 

En app.xaml:

<HierarchicalDataTemplate x:Key="BinderTemplate" 
DataType="{x:Type src:DocumentText}" ItemsSource="{Binding Path=/Children}"> 
      <TreeViewItem Header="{Binding}"/> 
     </HierarchicalDataTemplate> 

Ce code produit une liste de la première enfants, mais les enfants imbriqués ne sont pas affichés.

Répondre

4

Le problème principal dans ce que vous avez publié est que vous n'avez pas connecté le HierarchicalDataTemplate en tant que ItemTemplate de TreeView. Vous devez définir ItemTemplate="{StaticResource BinderTemplate}" ou supprimer la clé x: pour appliquer le modèle à toutes les instances de DocumentText. Vous devez également modifier TreeViewItem dans le modèle en TextBlock - le TreeViewItem est généré pour vous et ce que vous mettez dans ce modèle lui est appliqué en tant que HeaderTemplate.

+0

Merci! Cela a fait l'affaire. Je ne connaissais pas non plus HeaderTemplate. – Clay

+1

Je suis surpris que votre solution fonctionne, puisque vos objets ne déclenchent pas d'événements de modification de propriété ou de collection et que vous leur liez avant de remplir leurs collections. –

+0

@Robert - Je pense qu'il est sauvegardé par le fait que Binding ne démarre qu'après la fin du constructeur plutôt que pendant InitializeComponent. +1 sur le besoin de notifications de changement si. Cela permettra d'économiser beaucoup de frustration plus tard si vous implémentez INotifyPropertyChanged et utilisez ObservableCollection au lieu de List. –