IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

[WPF] treeview : récupérer le parent d'un élément sélectionné


Sujet :

Framework .NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut [WPF] treeview : récupérer le parent d'un élément sélectionné
    Bonjour

    J'ai un treeview. Je voudrais, lors d'un double-clic, récupérer le parent de l'élément sélectionné

    exemple :

    si, au moment du double clic, item 1.2.1 est sélectionné, je voudrais récupérer item 1.2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    item 1
        |- item 1.2
               |- item 1.2.1
               |- item 1.2.2
        |- item 1.2
     
    item 2
        |- item 2.1
        |- item 2.2

    Est-ce que quelqu'un sais comment faire ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    personne ?

  3. #3
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Si tu arrives, lors du double clic, à récupérer l'élément sélectionné, alors tu peux tenter de passer par un VisualTreelWalker qui va parcourir ton arbre.

    2 possibilités:
    - tu tentes le parcours depuis l'élément sélectionné et tu remontes
    - tu te places en haut du treeview et tu parcours jusqu'à l'élément sélectionné.


    Attention, c'est qu'une idée, j'ai pas testé.....

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    VisualTreeWalker c'est une classe qui existe déjà ? Ou c'est quelque chose que je dois faire moi ?

    Si c'est le premier cas, je n'en ai trouvé aucune trace.

    Si c'est le deuxième cas, ça ne m'avance pas beaucoup, puisse que mon problème est justement : comment remonter dans l'arbre ?

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Je me suis trompé de nom: je voulais parler de VisualTreeHelper et de sa méthode GetParent:

    http://msdn2.microsoft.com/en-us/lib...getparent.aspx

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Et même plus simple, en utilisant la propriété nommée "Parent" sur ton TreeviewItem

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Oui, je connais cette classe. Mais je ne parviens pas à m'en servir dans ce cas précis. Apparemment mon selectedItem n'est pas de type treeViewItem, il contient directement un objet de la collection que j'ai liée à mon treeView. Peut-être à cause des tempates ?

    mon treeView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <TreeView x:Name="ObservationsTreeView"
    		  ItemsSource="{Binding Path=Observations}"
    		  ItemTemplate="{StaticResource ObservationsTreeViewTemplate}"
    		  MouseDoubleClick="ObservationsTreeView_MouseDoubleClick"
    		  SelectedItemChanged="ObservationsTreeView_SelectedItemChanged"
     
    >
    les data templates

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <DataTemplate x:Key="TreeViewObservationsInstrumentTemplate">
    	<TextBlock Text="{Binding Instrument.Name, UpdateSourceTrigger=PropertyChanged}"/>
    </DataTemplate>
     
    <HierarchicalDataTemplate x:Key="TreeViewObservationsMediaTemplate" ItemsSource="{Binding Path=UsedInstruments}" ItemTemplate="{StaticResource TreeViewObservationsInstrumentTemplate}">
    	<TextBlock Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
    </HierarchicalDataTemplate>
     
    <HierarchicalDataTemplate x:Key="ObservationsTreeViewTemplate" ItemsSource="{Binding Path=Medias}" ItemTemplate="{StaticResource TreeViewObservationsMediaTemplate}">
    	<TextBlock Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" />
    </HierarchicalDataTemplate>

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Effectivement, à cause de ton DataTemplate, les éléments de ton Treeview sont des TextBlock.

    Par grave: tu arrives à récupérer le noeud sélectionné ? Si oui, essaye d'appellé la propriété Parent.

    Sinon, utilise cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    /// <summary>
    /// Return the parent of an element according to the type specified.
    /// </summary>
    /// <typeparam name="T">The type of the parent element you want to find.</typeparam>
    /// <param name="item">The element from which one you search for the parent.</param>
    /// <returns>The parent, in the visual tree, of the element, according to the specified type.</returns>
    private T FindParentOfType<T>(DependencyObject item) where T : DependencyObject
    {
        DependencyObject parent = VisualTreeHelper.GetParent(item);
     
     
     
        do
        {
            parent = VisualTreeHelper.GetParent(parent) as DependencyObject;
        }
        while (parent.GetType() != typeof(T)); 
     
        return parent as T;
    }
    Et tu l'utilise de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (item != null)
    {
        MessageBox.Show(FindParentOfType<TextBlock>(item).Text.ToString());
    }
    où item correspond à l'élément sélectionné...

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Effectivement, à cause de ton DataTemplate, les éléments de ton Treeview sont des TextBlock.
    Non, justement. Le type que je vois en debugant, c'est le type des objets contenu dans ma collection. Par exemple au premier niveau des CRObservationBO.


    EDIT : j'ai eu une idée. J'ai vu qu'il y avait dans la classe TreeView une méthode InputHitTest qui, d'après ce que j'ai compris, permet de récupérer l'élément se trouvant aux coordonnées spécifiées. Avec ça, je devrais pouvoir récupérer le textBlock...
    Je vais essayer

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    ça marche

    Avec InputHitTest j'arrive à récupérer le textBlock de l'élément cliqué et à partir de là à remonter dans l'arbre avec ta méthode FindParentOfType

  11. #11
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Qu'est ce qu'on dit à celui qui a codé la méthode

    On dit merki

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut



+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. TreeView récupérer la chaîne parents-enfants
    Par cobaye13 dans le forum Access
    Réponses: 0
    Dernier message: 13/04/2015, 12h20
  2. Réponses: 1
    Dernier message: 13/05/2013, 22h17
  3. Réponses: 1
    Dernier message: 14/08/2011, 14h14
  4. [XSL][XPATH] récupérer le nom de l'élément parent
    Par amadoulamine1 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 04/03/2009, 13h18
  5. Récupérer les dimensions de l'élément parent ?
    Par ghohm dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 02/09/2006, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo