2010-05-30 9 views
4

J'ai un référentiel d'arborescence bien défini. Où je peux renommer les éléments, les déplacer vers le haut, le bas, etc. Ajouter un nouveau et supprimer.Modèle et référentiel de liaison de données d'arbre WPF

Les données sont stockées dans un tableau comme suit:

Index Parent Label Left Right 
1  0  root  1  14 
2  1  food  2  7 
3  2  cake  3  4 
4  2  pie  5  6 
5  1  flowers 8  13 
6  5  roses 9  10 
7  5  violets 11  12 

Représentant l'arbre suivant:

     (1) root (14) 
     (2) food (7)     (8) flowers (13) 
    (3) cake (4) (5) pie (6) (9) roeses (10) (11) violets (12) 

et affiché visuellement comme suit:

root 
    food 
    cake 
    pie 
    flowers 
    roses 
    violets 

Maintenant, mon problème est comment représenter ceci d'une manière lisible, de sorte qu'un TreeView peut gérer tous les changements de données possibles ? Renommer est facile, tout ce dont j'ai besoin est de faire de l'étiquette un champ de mise à jour. Mais que faire si un utilisateur déplace des fleurs au-dessus de la nourriture? Je peux apporter les modifications de données pertinentes, mais elles provoquent une modification complète des données de tous les autres éléments de l'arborescence. Et tous les exemples que j'ai trouvés de hiérarchies bindable sont bons pour les arbres non statiques.

Donc ma solution actuelle (et mauvaise) est de recharger l'arbre affiché après le changement de relocalisation.

Toute direction sera bonne.

Merci

Répondre

0

Ne pas utiliser de TreeView utiliser un contrôle graphique 3ème partie. Une courte recherche google est venu avec plusieurs sites, consultez celui-ci par exemple GoSilverlightDemo consultez l'exemple OrgChartEditor, vous pouvez faire glisser les nœuds autour et changer les liens.

+0

Bon contrôle, mais c'est pour un projet opensource. Donc je ne peux pas l'utiliser – Amirshk

2

Avez-vous essayé d'utiliser une structure plutôt simple, y compris une ObservableCollection <> pour les nœuds enfants? Quelque chose qui mettrait en œuvre l'interface:

interface ITreeNode<T> 
    where T : ITreeNode 
{ 
    string Name { get; set; } 
    ObservableCollection<T> Children { get; } 
} 

Ensuite, vous pouvez utiliser un HeirarchicalDataTemplate pour votre XAML de TreeView:

<TreeView ItemsSource="{Binding MyTree}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

Vous devrez travailler vous-même glisser-déposer, mais cela ne devrait obtenir vous avez commencé à tout afficher.

Je viens récemment de faire moi-même au-dessus, et cet article CodeProject m'a aidé, dans le cas où vous avez besoin de plus: http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

Mise à jour:
Depuis que vous avez actuellement tout dans un format de table et je Supposons que vous ne voulez pas réviser votre structure de données par défaut, utilisez un IValueConverter pour obtenir les éléments que vous voulez. Ce code est non testé, mais je vais essayer quelque chose de semblable à ce qui suit:

{Binding Index, Converter={StaticResource myConverter}} 

Lorsque vous déclarez monconvertisseur, donnez-lui une référence à vos données tabulaires. En utilisant l'index comme valeur et ayant la référence à la table, vous pouvez renvoyer de la méthode convert un IEnumerable avec les résultats appropriés. Faites-moi savoir si vous avez besoin de plus de détails.