12
votes

Comment mélanger les niveaux de données et statiques dans une arborescence?

J'ai une collection d'objets em> de la base de données em>, chacun contenant des collections de schéma em> objets et utilisateur em> les objets. Je veux les lier à un arbre d'entrevoir, mais ajouter des niveaux statiques supplémentaires dans la hiérarchie, de sorte que l'arbre résultant semble plus ou moins comme ceci:

TreeViewItem treeViewItem = new TreeViewItem();
treeViewItem.Header = "All the databases:";
treeViewItem.ItemsSource = server.Databases;
treeView.Items.Add(treeViewItem);


0 commentaires

4 Réponses :


0
votes

Vous devez remplir les propriétés que vous utilisez dans votre liaison avec les données de votre base de données. Actuellement, vous utilisez un nouveau TreeViewItem , et l'utilise comme DataSource, donc ce que vous dites à propos de tout voir comme un seul noeud a du sens, comme vous l'avez placé dans un seul noeud .

Vous devez charger vos données de base de données et la joindre aux propriétés que vous avez utilisées dans votre modèle WPF en tant qu'artiens de liaison.


2 commentaires

Tony, je ne suis pas sûr de ce que tu veux dire. Bien que j'utilise le nouveau TreeViewItem, je lie la collection de bases de données à l'aide de la propriété ArbreViewItem's itemSource. La collecte de bases de données est automatiquement renseignée par le SMO (je n'ai pas inclus le code de configuration pour éviter d'encombrer mon message avec des détails non pertinents). Pourriez-vous s'il vous plaît fournir un exemple de code qui illustre ce que vous suggérez?


Je suppose que j'ai mal compris votre question initiale. Votre propriété .Databases charge toutes les données dans les propriétés de la classe et de la dépendance que vous utilisez dans vos reliures correctes? Je pensais que vos liaisons n'étaient pas chargées correctement de votre DataSource. Mais ne semble pas être le problème.



2
votes

Le problème est qu'un arbreView n'est pas très bien adapté à ce que vous voulez activer: il s'attend à ce que toutes les sous-notes soient du même type. Lorsque votre noeud de base de données a un nœud de type collection > et de type collection > Vous ne pouvez pas utiliser de hiérarchiquedaTemplate. Une meilleure approche consiste à utiliser des extenseurs imbriqués contenant des boîtes de liste.

Le code ci-dessous fait ce que vous voulez que je pense, tout en étant aussi proche que possible de votre intention d'origine: xxx


6 commentaires

Une arborescence ne s'attend parfaitement pas à ce que toutes les sous-notes soient du même type. Voir, par exemple, CODEPLEX.COM/COMPLEXDATEMATEMLES .


Ok, je me trompe peut-être à ce sujet. Peut-être que le seul problème est que le contenu par défaut d'un arbreViewItem ne prend pas en charge la notion d'un élément sélectionné (une liste de liste). L'article que vous mentionnez semble offrir une solution de contournement, ne prouvant pas du fait que les ignifuges sur le même niveau doivent avoir du contenu du même type.


Merci pour votre contribution! Je confirme le commentaire de Robert que TreeView ne s'attend pas à ce que tous les sous-notes soient du même type. Malheureusement, votre approche ne fonctionne pas tout cela bien. Bien que cela permet également de sélectionner des nœuds de niveau de feuille (quelques progrès), il sélectionne toujours le sous-arbre complet si je clique sur le nom de la base de données, laissant uniquement un rectangle blanc (non sélectionné) dans lequel la liste est.


Étrange, ça ne se produit pas ici. Êtes-vous sûr d'avoir utilisé mon XAML exact?


Mon erreur. Je n'ai pas remarqué que vous avez incorporé l'arbre rootviewItem directement dans un StackPanel plutôt que dans l'arbre d'arbre. Il se rapproche certainement de ce que je cherchais, mais je ne peux toujours pas sélectionner de noeud de base de données (tel que "DB1") et que, malheureusement, est requis pour mon scénario.


Désolé, je passe. J'espère que je vous ai donné de nouvelles idées. Faites-nous savoir comment vous avez résolu!



12
votes

oh man est une tâche incroyablement frustrante. J'ai essayé de le faire moi-même plusieurs fois. J'ai eu une exigence très similaire où j'ai quelque chose comme une classe client qui a à la fois une collection d'emplacements et une collection de commandes. Je voulais des emplacements et des ordres d'être des "dossiers" dans la vue d'arborescence. Comme vous l'avez découvert, tous les exemples d'Aperview qui vous montrent comment se lier à des types d'auto-référencement sont à peu inutiles.

J'ai d'abord eu recours à la construction manuelle d'un arbre de folderitindemnode et d'objets itemnode que je produisais dans la vue, mais Cela a vaincu le but de contraignant car il ne répondrait pas aux changements de collecte sous-jacents.

Puis je suis arrivé à une approche qui semble bien fonctionner.

  • Dans le modèle d'objet décrit ci-dessus, j'ai créé des classes locationCollection et de commande. Ils héritent tous deux d'observer l'observaCollection et remplacent la touche () pour renvoyer des "emplacements" et des "commandes" respectivement.
  • Je crée une classe multicollectionconverter qui implémente imultivalueconverter
  • J'ai créé une classe de foldernode qui possède une propriété Nom et articles. Ceci est l'objet de l'espace réservé qui représentera vos "dossiers" dans la vue d'arborescence.
  • Définir les hiérarchiques datateemplate qui utilisent des multibaines partout où vous souhaitez regrouper plusieurs collections d'enfants dans des dossiers.

    Le XAML résultant semble similaire au code ci-dessous et vous pouvez Saisissez un fichier zip qui possède toutes les classes et XAML dans un exemple de travail . xxx

     Dossiers dans TreeView


1 commentaires

Toute chance que l'exemple de travail que vous avez fourni existe toujours? J'ai juste essayé d'y accéder et le lien apparaît brisé.



0
votes

Voici une modification de la solution de Josh pour travailler avec SMO (mon énoncé de problème d'origine): xxx

et le convertisseur modifié: xxx blockQuote >

Attribution Remarque: Contenu copié de Solution finale de OP , posté comme un < HREF = "https://stackoverflow.com/revisions/1815056/3"> Modifier vers la question , plutôt que comme une réponse


0 commentaires