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

Windows Presentation Foundation Discussion :

HierarchicalDataTemplate WPF TreeView à partir d'un menu récursif?


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Par défaut HierarchicalDataTemplate WPF TreeView à partir d'un menu récursif?
    Bonjour à tous, je débute en WPF, et celà fait une semaine que je rame sur les treeView et les HierarchicalDataTemplate.

    En fait, j'ai une classe menu, qui comporte entre autre des items, chaque item contient des subitems, chaque subitem contient lui même des subitems etc....
    Je veux afficher ces items dans une arborescence treeView.
    J'ai utilisé HierarchicalDataTemplate.
    Problèmes
    -le treeView n'affiche que le premier niveau de l'arborescence.
    - le second niveau est affiché sous la forme "Project.Model.Items" (qui est le type de mes items)
    -Pas d'autres niveaux que ces deux là.

    Voilà quelques bout de code xaml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Grid.Resources>
     
                <HierarchicalDataTemplate DataType="{x:Type tes:Items}" x:Key="Temp">
                    <TreeViewItem  IsExpanded="True" Header="{Binding Path=Label}" ItemsSource="{Binding Path=Subitems}">
                    </TreeViewItem>
               </HierarchicalDataTemplate>
             </Grid.Resources>
    et pour le treeView:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     <TreeView SelectedItemChanged="TreeView_SelectedItemChanged" DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelPropertyMenu}" AllowDrop="True"  >
     
                    <TreeViewItem  Header="{Binding Path=Name}" ItemTemplate="{StaticResource Temp}" ItemsSource="{Binding Path=it, Mode=TwoWay}" IsExpanded="True">
     
                    </TreeViewItem>
     
     
                </TreeView>
    Merci d'avance pour votre aide j'espère vraiment trouver la solution, car là je blocke.

  2. #2
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Par défaut Rectification
    J'ai enfin réussi à afficher le treeView proprement en spécifiant les dataType et ItemsSource de mes HierarchicalDataTemplate. Par contre, je ne trouve toujours pas de solution pour la récursivité. C'est à dire que le TreeView m'affiche autant de niveaux que les HierarchicalDataTemplate que j'ai spécifié.
    Voilà le code de mes HierarchicalDataTemplate corrigé, pour ceux qui pourraient en avoir besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <Grid.Resources>
     
                <HierarchicalDataTemplate DataType="{x:Type tes:Items}"  x:Key="Temp" ItemsSource="{Binding Path=Subitems}">
                    <TextBlock  Text="{Binding Path=Label}" />
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate DataType="{x:Type tes:Items}" ItemsSource="{Binding Path=Subitems}">
                            <TextBlock Text="{Binding Path=Label}"/>
                        </HierarchicalDataTemplate>
     
                    </HierarchicalDataTemplate.ItemTemplate>
               </HierarchicalDataTemplate>
             </Grid.Resources>

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Dans l'idéal on devrait pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <HierarchicalDataTemplate DataType="{x:Type tes:Items}"  x:Key="Temp" ItemsSource="{Binding Path=Subitems}" ItemTemplate="{StaticResource Temp}">
    	<TextBlock  Text="{Binding Path=Label}" />
    </HierarchicalDataTemplate>
    Mais malheureusement il ne semble pas que le système de gestion des ressources de WPF le gère.

    Un hack est de passer par du code-behind, par exemple en créant un DataTemplateSelector qui renverrait toujours ton template "Temp" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return Application.Current.MainWindow.Resources["Temp"]
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <local:ItemSelector x:Key="Selector" />
    <HierarchicalDataTemplate DataType="{x:Type tes:Items}"  x:Key="Temp" ItemsSource="{Binding Path=Subitems}" ItemTemplateSelector="{StaticResource Selector}">
    	<TextBlock  Text="{Binding Path=Label}" />
    </HierarchicalDataTemplate>
    Code non testé mais le principe est là.

  4. #4
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Par défaut
    Merci seriousme d'avoir répondu. Comme tu l'as bien dit, l'idéal est d'utiliser la récursivité, malheureusement WPF ne le permet pas. J'essaies d'implémenter le code behind que tu m'as proposé, seul hic, j'arrive pas à comprendre à quoi correspond local et ItemSelector. dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <local:ItemSelector x:Key="Selector" />
    Est ce que je dois créer une nouvelle classe ItemSelector et lui faire référence dans local ou quoi?
    Car j'ai essayé de faire une fonction ItemSelector, mais je ne trouve pas comment lui faire appel dans le code XAML.

    Merci encore.

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        <Grid>
            <Grid.Resources>
                <HierarchicalDataTemplate DataType="{x:Type tes:Items}"
                                          ItemsSource="{Binding SubItems}">
                    <TextBlock Text="{Binding Label}" />
                </HierarchicalDataTemplate>
            </Grid.Resources>
            <TreeView ItemsSource="{Binding .}" />
        </Grid>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        <Grid>
            <TreeView ItemsSource="{Binding .}">
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="{x:Type tes:Items}"
                                              ItemsSource="{Binding SubItems}">
                        <TextBlock Text="{Binding Label}" />
                    </HierarchicalDataTemplate>
                </TreeView.Resources>
            </TreeView>
        </Grid>
    fonctionne bien. Ce n'est pas ce que tu souhaites faire ?

  6. #6
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Par défaut
    Non Spazou, ça ne résout pas mon problème.
    Je veux afficher en quelques sorte un TreeView qui pourrait être infini.
    Il s'arrête quand il n'ya plus de sous éléments à binder.
    Merci quand même

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

Discussions similaires

  1. Récupération des données à partir d'un menu
    Par projetM dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2006, 00h29
  2. Réponses: 2
    Dernier message: 03/02/2006, 20h14
  3. Réponses: 1
    Dernier message: 01/11/2005, 03h24
  4. [mise à jour d'une iframe à partir d'un menu déroulant]
    Par Lady_jade dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/10/2005, 11h50
  5. Startx lancé à partir d'un menu
    Par radium dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 15/07/2005, 08h43

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