Salut,
J'ai un TreeView dont les éléments ont été définis via une CollectionViewSource contenant des objets persos.
J'aimerai accéder au TreeViewItem parent de l'objet sélectionné.
Comment puis-je faire ?
Merci d'avance.
Salut,
J'ai un TreeView dont les éléments ont été définis via une CollectionViewSource contenant des objets persos.
J'aimerai accéder au TreeViewItem parent de l'objet sélectionné.
Comment puis-je faire ?
Merci d'avance.
Sur ton treeview, accède à l'ItemContainerGenerator et utilise la méthode ContainerFromInder: http://msdn.microsoft.com/en-us/libr...rfromitem.aspx
Thomas LEBRUN: MCAD.NET, MCTS (Win et Web), MCPD(Win et Web) & Microsoft MVP Client Application Development
WPF par la pratique, mon livre sur WPF ! (également disponible ici ou là)
A la découverte de .NET
Si je ne dis pas de bêtise, cette méthode permet de récupérer le TreeViewItem correspondant à un objet.
Moi j'aimerai pouvoir récupérer le TreeViewItem parent, autrement dit celui de niveau N-1 dans l'arborescence...
Exemple :
Quand je sélectionne le noeud Noeud1-1, j'aimerai pouvoir récupérer le noeud Noeud1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 +Noeud1 Noeud1-1 Noeud1-2 +Noeud2
Ben, tu utilises ma technique + sur le TreeviewItem récupéré, tu utilises la propriété Parent.
Thomas LEBRUN: MCAD.NET, MCTS (Win et Web), MCPD(Win et Web) & Microsoft MVP Client Application Development
WPF par la pratique, mon livre sur WPF ! (également disponible ici ou là)
A la découverte de .NET
Je me permets de revenir sur ce sujet que j'avais totalement zappé... :S
Alors, tout d'abord, je me suis rendu compte que la méthode ContainerFromItem d'un TreeView ne fonctionne QUE pour les noeuds de niveau 1.
Si on appelle cette méthode avec en paramètre un objet représenté par un noeud de niveau 2 (comme "Noeud1-1" dans mon exemple), cela renvoie null.
Pour pallier cela, j'ai récupérer les méthodes d'extension décrites ici.
Du coup, si j'appelle ceci :
où myNode11Object est l'objet représenté par le noeud "Noeud1-1", j'obtiens bien le TreeViewItem correspondant.
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part TreeViewItem myTvi = myTreeView.ContainerFromItem(myNode11Object) as TreeViewItem;
Par contre, si la propriété Parent de ce TreeViewItem me renvoie toujours null.
Es-tu sûr que la propriété Parent renvoie le TreeViewItem parent ?
PS : J'ai remarqué que la propriété ParentTreeViewItem (qui n'est malheureusement pas publique) me renvoie bien le TreeViewItem parent que j'attend...
Ah ben en fait, j'ai trouvé la solution sur ton blog
Chez moi, ta méthode renvoie bien le TreeViewItem parent, par contre la propriété Parent renvoie null, contrairement à ce que tu dis dans le post.
A voir donc...
Content que cela ait pu t'aider tout de même![]()
Thomas LEBRUN: MCAD.NET, MCTS (Win et Web), MCPD(Win et Web) & Microsoft MVP Client Application Development
WPF par la pratique, mon livre sur WPF ! (également disponible ici ou là)
A la découverte de .NET
Chez moi ca ne fonctionne pas, VisualTreeHelper.GetParent(item) lorsque item est un TreeViewItem, me renvoie null.
Pour info, j'avais dû rajouter la condition "parent != null" dans le while.
Ce qui donnait ça :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public static T FindParentOfType<T>(DependencyObject item) where T : DependencyObject { DependencyObject parent = VisualTreeHelper.GetParent(item); do { parent = VisualTreeHelper.GetParent(parent) as DependencyObject; } while (parent != null && parent.GetType() != typeof(T)); return parent as T; }
Sinon question : tu appelles la méthode sur quel noeud ?
Si c'est un noeud de niveau 1, c'est normal qu'il te renvoie null...
Oui ca doit être pour ca tu as raison, comme moi ce qui m'intéresse c'est de récupérer le TreeView de n'importe quel TreeViewItem, j'ai donc fait ainsi. Je ne sais pas si il y a plus propre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public static TreeView GetTreeView(TreeViewItem treeviewItem) { DependencyObject l_dependencyObject = treeviewItem; while(l_dependencyObject != null && !(l_dependencyObject is TreeView)) { DependencyObject l_tmp = VisualTreeHelper.GetParent(l_dependencyObject); if (l_tmp == null) l_tmp = ((TreeViewItem)l_dependencyObject).Parent; l_dependencyObject = l_tmp; } return (TreeView)l_dependencyObject; }
Partager