2009-09-24 12 views
0

J'essaie de créer une arborescence à trois niveaux dans WPF. Fondamentalement, j'ai une liste d'éléments de haut niveau qui ont tous un élément supplémentaire. Ces articles pour enfants peuvent ou non avoir eux-mêmes des articles.Créer une arborescence dans WPF

Quelqu'un connaît un tutoriel disponible sur le net?

Répondre

4

La façon la plus simple est d'utiliser les liaisons et HierarchicalDataTemplate. Déclarer une classe avec vos données:

class Item : INotifyPropertyChanged 
{ 
    public Item() 
    { 
     this.Children = new ObservableCollection<Item>(); 
    } 

    public event PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public ObservableCollection<Item> Children { get; private set; } 
} 

Et définir un HierarchicalDataTemplate pour ce type:

<HierarchicalDataTemplate DataType="{x:Type my:Item}" 
          ItemsSource="{Binding Items}"> 
    <TextBlock Text="{Binding Name}"/> 
</HierarchicalDataTemplate> 

Maintenant, il vous suffit de lier le ItemsSource du TreeView à votre collection d'articles de haut niveau, et les nœuds d'arbre seront construits automatiquement. Si vous devez ajouter (ou supprimer) un nœud, ajoutez simplement un élément à (ou supprimez-le) de la collection parent

Pour cet exemple, j'ai utilisé un type d'élément unique, mais si vous avez plusieurs types à afficher dans le TreeView vous devrez définir un HierarchicalDataTemplate pour chacun. Pour les nœuds feuille (nœuds sans enfants), vous pouvez simplement utiliser un DataTemplate

+0

Si vous omettez le fait que je ne déclare pas le DataType et que Header ne semble pas exister, j'ai pu le faire fonctionner avec différents objets avec plus de alors un type. la date affichée a le même nom de propriété pour que cela fonctionne. Ce n'est peut-être pas le meilleur moyen, mais comme l'affichage doit être simple, je vais le faire comme ça pour l'instant. –

+0

En effet, il y avait une erreur dans mon code, la propriété Header n'existe pas ... c'est corrigé maintenant –

2

Cet exemple peut être ce que vous avez besoin: http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

+0

Wow ... ne savais pas que ça pouvait être si compliqué pour quelque chose si simple ... –

+0

Je sais que c'est de 4 ans mais ça vaut le coup de dire ... Amen à ça. Les tutoriels WPF à travers le net sont horriblement compliqués. Plus j'avance, plus je vois, je ne pense pas que la moitié des gens qui écrivaient des tutoriels savaient vraiment ce qu'ils faisaient. Les choses dans WPF ne doivent pas être si compliquées ... – TheFuzzyGiggler

0

Peut-être un peu en retard pour votre problème, mais quelqu'un qui se heurte au même problème. J'ai trouvé un très bon contrôle gratuit pour WPF: DW.WPFToolkit Avec une bonne documentation ..

Questions connexes