2010-09-08 4 views
0

Je veux construire dynamiquement un TreeView en utilisant un nœud qui représente un nœud d'arbre typique. Le nœud ressembleUne meilleure façon de remplir dynamiquement le TreeView

class Node 
{ 
    public Node(string cont) { 
     Content = cont; 
     Children = new List<Node>(); 
    } 

    public string Content { get; set; } 
    public List<Node> Children { get; set; } 
    public bool IsLeaf { 
     get { return Children.Count == 0; } 
    } 
    public bool IsVisible { 
     get { return true; } 
    } 
} 

Pour ce que j'ai écrit simple traversal arbre qui ajoute TreeViewItems

void XmlTreeTraversal(DataPoolNode curNode, TreeViewItem curViewNode) { 
     if (curNode.IsLeaf) 
      return; 

     var contentNode = (DataPoolNode)curNode; 
     foreach (var node in contentNode.Children) { 
      TreeViewItem childViewNode = AddNewNodeToTreeView(node.Content, curViewNode); 

      XmlTreeTraversal(node, childViewNode); 
     } 
    } 

    TreeViewItem AddNewNodeToTreeView(string description, TreeViewItem curViewNode) { 
     TreeViewItem newTVI = new TreeViewItem(); 
     newTVI.Header = description; 
     curViewNode.Items.Add(newTVI); 
     return newTVI; 
    } 

Le problème avec l'approche est que les données et la vue sont étroitement liés. Donc, il ne répond pas MVVC. Peut-être, vous connaissez une autre solution pour ce problème?

Répondre

0

Ne créez pas l'arbre vous-même. Le contrôle TreeView est l'un des contrôles qui profite fortement de DataBinding et encore plus de MVVM. Sans, ça peut être une douleur de travailler avec. Avec DataBinding et MVVM, utiliser TreeView est vraiment simple:

Vous avez déjà une bonne source pour TreeView. C'est votre Node -classe. Définir une liste au nœud racine comme ItemsSource de votre TreeView ...

m_treeView.ItemsSource=new List<Node>(){yourRootNode}; 

... Faites un HierarchicalDatraTemplate pour vos nœuds. Quelque chose comme ...

<HierarchicalDataTemplate x:Key="TreeViewItem_HierarchicalDataTemplate" ItemsSource="{Binding Children}" > 
     <TextBlock Text="{Binding Content}" />     
</HierarchicalDataTemplate> 

... et définissez le ItemsTemplate du TreeView en conséquence ...

<TreeView Name="m_treeView" ItemTemplate="{StaticResource TreeViewItem_HierarchicalDataTemplate}" .../> 

Si la classe Node est déjà le ViewModel, il peut être intéressant d'inclure également un IsSelected et IsExpandend-propriété et la liaison des ItemsContainerStyle-properies à ce (ne pas oublier le INotifyPropertyChanged événement) ..

<TreeView.ItemContainerStyle>     
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
     <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
    </Style> 
</TreeView.ItemContainerStyle> 

au début, il est un peu plus de travail b Cela peut vous faire économiser des heures si vous voulez effectuer des opérations plus compliquées, telles que la sélection et l'expansion automatiques.

Questions connexes