Question

Je veux être en mesure de traverser l'arbre ui visuel à la recherche d'un élément avec un ID lié à la propriété Tag de l'élément visuel.

Je me demande comment je fais. Les contrôles ne sont pas les enfants à traverser.

Je commencé à utiliser LogicalTreeHelper.GetChildren, qui semble fonctionner comme prévu, jusqu'à ce que je frappe un contrôle TreeView ... alors LogicalTreeHelper.GetChildren ne marche pas retour des enfants.

Note: le but est de trouver l'élément d'interface visuelle qui correspond à l'élément de données. Ainsi, compte tenu d'un ID de l'élément, l'élément Go trouver l'interface utilisateur de l'afficher.

Edit: Je ne suis pas apparemment assez bien ce expliquais. Je lient des objets de données à un contrôle TreeView et vouloir sélectionner un élément spécifique programaticly donné l'ID de cet objet métier. Je ne vois pas pourquoi il est si difficile de l'arbre visuel Travers et de trouver l'élément que je veux, comme l'ID de l'objet de données est dans la propriété Tag de l'élément visuel approprié. J'utilise Mole et je suis en mesure de trouver l'élément d'interface utilisateur avec l'ID appropriée dans ce de la balise. Je ne peux pas trouver l'élément visuel dans le code. LogicalTreeHelper ne traverse aucun élément dans l'arborescence. Ni ItemContainerGenerator.ContainerFromItem ne récupère rien pour les éléments dans l'arborescence.

Pas de solution correcte

Autres conseils

un coup d'oeil un rel="nofollow. J'ai trouvé cet échantillon très bien écrit et je crois que grâce à la vue modèle permettra de résoudre votre problème.

Modifier Et en ce qui concerne la recherche de l'arbre visuel. Les deux TreeView et TreeViewItem ont la propriété Items que vous pouvez parcourir et rechercher votre identifiant. Tu ne peux pas l'utiliser?

Le problème est que seul le TreeViewItems qui sont visibles ont été créés - WPF ne crée pas tous les éléments à l'avant (en raison de la longueur du temps qui pourrait prendre pour de grands arbres, j'imagine)

.

Une meilleure approche serait de créer une structure de données qui imite la structure de vos données sur les arbres, et utiliser la liaison de données pour indiquer au TreeView comment afficher ces données. Je peux écrire un exemple simple, si vous le souhaitez.

EDIT: En fonction de votre édition, qui ne fonctionnera que si l'élément de l'interface utilisateur a été créé pour cet objet, qui est pas garanti. Jetez un oeil à la IItemContainerGenerator interface ( récupéré en appelant ItemsControl.ItemContainerGenerator . Je crois que cela a une méthode qui renverra le conteneur de l'interface utilisateur (c.-à-TreeViewItem) pour un objet de données donné. cela ne fonctionnera que si le conteneur de l'interface utilisateur a été précédemment créé.

LogicalTreeHelper.GetChildren regarde la propriété LogicalChildren du contrôle, qui est nulle par défaut pour un TreeView (dérivé de la classe ItemsControl). Vous pourriez avoir à inspecter le type des objets retournés par GetChildren et quand vous arrivez à un objet TreeView, puis faire une logique de traitement spécial.

Cette logique particulière sera probablement itérer sur les objets de l'arbre et en essayant de les jeter à un FrameworkElement (la classe de base qui définit la propriété Tag).

Je l'ai fait des choses similaires par récursion à travers l'arbre visuel en utilisant VisualTreeHelper. Consultez ce blog écrit par Jim Baltzell-Gauthier - il fournit des méthodes d'aide pour marcher l'arbre visuel et retourner un élément par nom et le type, ce qui est similaire au code que je me sers de mon projet en cours. Vous pouvez modifier ces fonctions pour avoir vérifier les valeurs de balises au lieu ou en plus du nom.

Une chose à être au courant avec l'arborescence visuelle est qu'il est pas là à moins que les visuels ont été chargés - vous devrez peut-être joindre un délégué à l'événement « Loaded » de votre élément visuel si le visuel n'a pas été rendu encore au point que vous appelez le code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top