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 :

[WPF] TreeView avec CheckBox en cascades?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Par défaut [WPF] TreeView avec CheckBox en cascades?
    Bonjour,

    J'ai besoin de faire un treeview dont les elements contiennent une checkbox et un label, et j'aimerais faire en sorte que lorsqu'on coche/decoche un checkbox, que tous les fils suivent.

    Quelqu'un pourrait-il me mettre sur la piste sur comment faire?

    Je sais qu'il faut utiliser un datatemplate pour les items du treeview mais je ne vois pas comment gérer la partie event.

  2. #2
    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
    Par défaut
    Citation Envoyé par bakonu Voir le message
    que tous les fils suivent.
    Cad ? Tu veux que si on cliques sur un item de ton Treeview (Checkbox), ca cliques sur tous les items enfants de cet item ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Dans l'hypothèse #1, je dirais que dans le checkbox_Click, tu récupères le treeviewitem via sender.Parent ou quelquechose dans ce genre. Et ensuite parcours récursif des treeviewitem.items en cochant les checkbox.

    Ou alors, quand tu décoches la checkbox tu joues sur la propriété IsEnabled pour désactiver la suite de l'arbre.

  4. #4
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Par défaut
    Merci pour vos réponse, j'ai utilisé un HierarchicalDataTemplate, cependant j'ai encore un problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <HierarchicalDataTemplate DataType="{x:Type local:Hierarchical}" 
                ItemsSource="{Binding Path=Children}">
                <StackPanel Orientation="Horizontal">
                    <CheckBox Name="CB" IsChecked="{Binding Path=Wanted}" 
                              Checked="CB_Checked" Unchecked="CB_Checked" />
                    <Label Foreground="Black" Content="{Binding Path=Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
    Mon problème est que, quand je coche une checkbox, je modifie le Wanted des fils aussi mais, bien qu'il y ait un binding, les checkbox fils ne sont pas mis à jour à l'affichage uniquement, je ne sais pas si je m'explique bien.

    En gros, j'ai la structure :

    + a
    b
    c
    d

    quand je coche 'a', ça coche b, c et d également, dans mes objets Hierarchical, mais ça ne met pas à jour, leur checkbox associées.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Je suis pas sur de bien comprendre ce qui ne se fait pas :
    1/ La checkbox est cochée mais le booléen (enfin je suppose) de ton objet bindé n'est pas changé ?
    2/ Au debug tu as bien la propriété checked = true, mais rien à l'affichage ?

    Dans le premier cas, faut voir quand est ce que le binding de la checkbox notifie de son changement d'état : par exemple pour une textbox c'est à la perte de focus, peut être que c'est autre chose pour une checkbox ?
    Au besoin du peux essayer de le forcer avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maCheckBox.GetBindingExpression(CheckBox.LaPropriétéCheckedQueJeSaisPlusCommentElleS'appelle).UpdateSource();
    Dans le deuxième cas, ton objet métier doit implémenter les interfaces INotifyPropertyChanged, INotifyPropertyChanging

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    Tiens, je suppose que ce qui suit est ce que tu voulais faire (je m'embête au boulot, oui... ) :

    Coté Xaml, c'est très simple, y a juste un ButtonBase.Click à donner dans la balise du TreeView, le reste est bidon...

    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
            <TreeView ButtonBase.Click="TreeView_Click">
                <TreeViewItem>
                    <TreeViewItem.Header>
                        <CheckBox>Label 1</CheckBox>
                    </TreeViewItem.Header>
     
                    <TreeViewItem>
                        <TreeViewItem.Header>
                            <CheckBox>Label 2</CheckBox>
                        </TreeViewItem.Header>
     
                        <TreeViewItem>
                            <TreeViewItem.Header>
                                <CheckBox>Label 3</CheckBox>
                            </TreeViewItem.Header>
     
                        </TreeViewItem>
                    </TreeViewItem>
                </TreeViewItem>
            </TreeView>
    Pour ce qui est du code, là encore c'est très rapide et simple :

    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
    22
    23
    24
    25
    26
            private void TreeView_Click(object sender, RoutedEventArgs e) {
                try {
                    CheckBox source = ((CheckBox) e.OriginalSource);
                    TreeViewItem parent = (TreeViewItem) source.Parent;
                    if (source.IsChecked == true)
                        CocherEnfants(parent);
                    else
                        DecocherEnfants(parent);
                }
                catch {
                }
            }
     
            private void CocherEnfants(TreeViewItem parent) {
                foreach (TreeViewItem item in parent.Items) {
                    ((CheckBox) item.Header).IsChecked = true;
                    CocherEnfants(item);
                }
            }
     
            private void DecocherEnfants(TreeViewItem parent) {
                foreach (TreeViewItem item in parent.Items) {
                    ((CheckBox) item.Header).IsChecked = false;
                    DecocherEnfants(item);
                }
            }
    Bien sur, ca n'est pas forcément très propre, puisque le Try/Catch permet de virer les évènements lancés par le ToggleButton des TreeViewItems (quand on les plie/déplie). Mais bon, ça marche comme tu souhaitais...

    Apres, bien sur, pour améliorer le code xaml, tu peux te faire un template qui mette directement le label du header du TreeviewItem dans un Checkbox, sans avoir à le déclarer explicitement, mais bon, c'est de l'amélioration syntaxique mais ca ne change rien au résultat...

    Je n'ai pas encore abordé les TreeViews et autres listes dans mon bouquin (Pro WPF in C# 2008), donc j'ai fait ca avec ce que j'ai appris depuis, donc forcément ça n'utilise aucune subtilité des TreeViews

Discussions similaires

  1. Treeview avec checkboxes
    Par chris81 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 04/02/2008, 11h25
  2. [WinForm] TreeView avec checkbox grisée
    Par Thor Tillas dans le forum Visual C++
    Réponses: 2
    Dernier message: 22/03/2007, 13h27
  3. vb.net : treeview avec checkbox
    Par 1coni dans le forum Windows Forms
    Réponses: 11
    Dernier message: 31/05/2006, 13h18
  4. [C#] TreeView avec CheckBox à certain niveaux
    Par Maxsin dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/04/2006, 16h29
  5. [C#] TreeView avec CheckBox "indeterminate"
    Par padumeur dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/01/2005, 20h53

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