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 :

TreeView / HierarchicalDataTemplate / TreeViewItem : comment faire ?


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut TreeView / HierarchicalDataTemplate / TreeViewItem : comment faire ?
    Bonjour,

    A chaque fois que j'ai voulu créer un TreeView à partir d'une ObservableCollection d'objets perso, je me suis créé un HierarchicalDataTemplate qui faisait en gros ceci :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            <HierarchicalDataTemplate x:Key="MyTemplate"
                                      DataType="{x:Type local:MyDataType}">
                <TextBlock Text={Binding Path=MyProperty} />

    Mon problème est que j'aimerai avoir des TreeViewItem classiques (sans remplacer leur template par un TextBlock) car si je me crée un arbre statique de la sorte :
    Code xml : 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
     
                        <TreeView VerticalAlignment="Stretch"
                                  Height="200">
                            <TreeView.Items>
                                <TreeViewItem Header="111">
                                    <TreeViewItem Header="111111" 
                                                  Foreground="Blue"/>
                                    <TreeViewItem Header="222222" />
                                    <TreeViewItem Header="333333" />
                                </TreeViewItem>
                                <TreeViewItem Header="222">
                                    <TreeViewItem Header="111111"
                                                  IsEnabled="False" />
                                    <TreeViewItem Header="222222" />
                                    <TreeViewItem Header="333333"
                                                  IsEnabled="False" />
                                </TreeViewItem>
                                <TreeViewItem Header="333" />
                                <TreeViewItem Header="444" />
                            </TreeView.Items>
                        </TreeView>
    je peux facilement désactiver un noeud ce qui va le griser et renvoyer sur son noeud parent quand on clique dessus, changer la couleur du Header, etc.

    C'est exactement ce que j'aimerai avoir comme comportement, et je n'arrive pas à le reproduire avec un TextBlock.

    Quelqu'un saurait comment faire ?

    Merci d'avance !

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Comme ca, à froid, je te dirais: tu as essayé ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <HierarchicalDataTemplate x:Key="MyTemplate"
                                      DataType="{x:Type local:MyDataType}">
                <TreeviewItem Content={Binding Path=MyProperty} />

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    J'avais déjà essayé de faire ça :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <HierarchicalDataTemplate x:Key="MyTemplate"
                                      DataType="{x:Type local:MyDataType}">
                <TreeViewItem Header={Binding Path=MyProperty} />
    Mais j'ai l'impression que ça me crée un TreeViewItem dans unTreeViewItem.
    Du coup, y'a un décalage dans la présentation d'une 20aine de pixels en gros par rapport à un arbre créé de manière "statique" et en plus on ne peut cliquer que sur cette partie blanche de 20 pixels pour sélectionner un noeud. Le clic sur le Header ne sélectionne pas le noeud.

    Du coup, je me suis dit que le HierarchicalDataTemplate créé directement un TreeViewItem auquel il applique le template défini...

    J'ai aussi essayé d'utiliser directement un ContentPresenter, mais du coup il ne connaît pas la propriété Foreground...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    Citation Envoyé par seiryujay
    je peux facilement désactiver un noeud ce qui va le griser et renvoyer sur son noeud parent quand on clique dessus, changer la couleur du Header, etc.
    Dans le style "ItemContainerStyle", tu peux binder les propriétés IsEnabled, IsSelected et autres propriétés qui t'intéresse pour obtenir le comportement qui t'intéresse. Il faut étendre ton objet MyDataType pour qu'il ait une propriété IsEnabled, IsSelected, etc et les renseigner lors des actions utilisateurs.

    Tu as les triggers pour mettre les couleurs qui vont bien. Je pense que c'est possible ainsi.

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    J'essaie d'utiliser ItemContainerStyle, mais je n'arrive pas à faire ce que je veux.
    Ce qu'il me faudrait, c'est un moyen de dire que tous les TreeViewItem fils du TreeViewItem actuel (appelé T1) sont désactivés (IsEnabled=False) dans le cas où une propriété de l'objet affiché dans T1 est à false.

    Je pourrai rajouter directement un attribut IsEnabled à mes objets représentés par les TreeViewItem fils, mais j'essaie pour l'instant d'éviter cet ajout de paramètres supplémentaires.

    Voici pour l'instant ce que j'ai fait :
    Code xml : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
            <!--Template destiné à représenter les noeuds de niveau 1-->
            <HierarchicalDataTemplate DataType="{x:Type rt:RemoteTerminal_C}"
                                      ItemsSource="{Binding SubAddresses}"
                                      ItemTemplate="{StaticResource SubAddressTemplate}">
                <StackPanel x:Name="panelItemDescription"
                            Orientation="Horizontal">
                    <utils:AutoGreyableImage x:Name="imgStatus"
                                             Width="16"
                                             Height="16"
                                             Margin="3,0"
                                             Source="pack://application:,,,/Images/16x16/greenLed.png" />
                    <Label x:Name="txtItemDescription"
                           Padding="0"
                           Height="15" />
                </StackPanel>
    
    
                <!--*****Triggers*****-->
                <HierarchicalDataTemplate.Triggers>
                    <!--Triggers modifiant l'image et le label en fonction de différentes propriétés-->
                </HierarchicalDataTemplate.Triggers>
    
    
    
                <!--*****Style*****-->
                <HierarchicalDataTemplate.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <Setter Property="IsEnabled"
                                Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type rt:RemoteTerminal_C}}, Path=IsChildrenEnabled, Mode=TwoWay}" />
                    </Style>
                </HierarchicalDataTemplate.ItemContainerStyle>
            </HierarchicalDataTemplate>
    
    
            <!--Template destiné à représenter les noeuds de niveau 2-->
            <DataTemplate x:Key="SubAddressTemplate"
                          DataType="{x:Type rt:SubAddressForRemoteTerminal_C}">
                <StackPanel x:Name="panelItemDescription"
                            Orientation="Horizontal">
                    <utils:AutoGreyableImage x:Name="imgStatus"
                                             Source="pack://application:,,,/Images/16x16/blueLed.png"
                                             Width="16"
                                             Height="16"
                                             Margin="3,0" />
                    <Label x:Name="txtItemDescription"
                           Padding="0"
                           Height="15" />
                </StackPanel>
    
    
                <!--*****Triggers*****-->
                <DataTemplate.Triggers>
                    <!--Triggers modifiant l'image et le label en fonction de différentes propriétés-->
                </DataTemplate.Triggers>
            </DataTemplate>

    Malheureusement, mes noeuds fils ne sont jamais désactivés.
    Est-ce que vous voyez ce que je fais de mal ?

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    En fait, si je lui mets directement ça :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                <HierarchicalDataTemplate.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <Setter Property="IsEnabled"
                                Value="False" />
                    </Style>
                </HierarchicalDataTemplate.ItemContainerStyle>
    ça fonctionne.

    Le problème vient donc de l'accès à mon objet de niveau 1 depuis l'ItemContainerStyle.
    Est-ce au moins possible ? C'est ce que je vais essayer de découvrir...

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

Discussions similaires

  1. Comment Faire un Treeview
    Par manu7607 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 12/11/2009, 16h16
  2. Treeview liste d'images + champ image : très lent, comment faire ?
    Par Cazaux-Moutou-Philippe dans le forum WinDev
    Réponses: 3
    Dernier message: 01/11/2006, 17h59
  3. Comment faire un Collapse "All" sur un TreeView ?
    Par Le Marin dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/09/2006, 10h39
  4. [c#] comment faire pour garder des noeuds ouverts treeview?
    Par irnbru dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/11/2005, 00h47
  5. [C#] Comment faire pour élargir un treeview?
    Par irnbru dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/11/2005, 10h10

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