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 :

Récupérer valeur dans un DataTemplate


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut Récupérer valeur dans un DataTemplate
    J'aimerais savoir comment récupérer la valeur d'un control situé dans un DataTemplate

    j'ai une classe (que jai simplifié)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MonObjet
    {
         public int id;
         public string name;
    }
    et je cré une listbox comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <ListBox x:Name="maListe">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="30" />
                                        <ColumnDefinition Width="200" />
                                    </Grid.ColumnDefinitions>
                                    <CheckBox Grid.Column="0" x:Name="chbValid" />
                                    <Label Grid.Column="1" x:Name="labelName" Content="{Binding Path=name}" />
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
    que je rempli avec un bind
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListe.ItemsSource = new Collection<MonObjet>() {obj1, obj2, ... , objN};
    comment récupérer la valeur de chaque checkbox pour chaque élément de ma listBox

    merci d'avance pour votre aide !
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  2. #2
    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
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Un petit foreach sur les items de la listBox devrait fonctionner :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach(var i in maListe.Items){
      // i.id et i.name devrait le faire (peut-être un cast du i en MonObjet en plus, à voir
    }

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Sinon, tu peux essayer la méthode FindName

  4. #4
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    le foreach me renvoi un objet de type MonObjet et moi je souhaite récupérer le checkbox associé a mon objet
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  5. #5
    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
    Points : 3 015
    Points
    3 015
    Par défaut
    Tu voudrais le checkbox ou la valeur du checkbox

    Car si c'est la valeur du checkbox, tu peux ajouter une propriété dans MonObjet ( public bool bCheckBox; ), et là le foreach convient.

    Pour l'autre cas je vois pas trop pour l'instant, que veux tu en faire de ce checkbox ?

  6. #6
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    en gros le but et d'avoir une liste contenant mes objets (objet LINQ) que je sélectionne via une checkbox (car il y a beaucoup d'objets)pour pouvoir travailler avec la selection (supprimmer, mettre à jour, ...)
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  7. #7
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Bon ben j'ai recréer un objet encapsulant le premier et qui contient une propriété bool IsSelected

    je pensé qu'il y aurai une autre solution mais a priori non !
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  8. #8
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    pour ce qui est de juste utiliser des checkbox pour sélectionner ou non les objet j'ai utilisé cette approche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
    et ensuite je récupère tous mes objets sélectionnés dans ListView.SelectedItems

  9. #9
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Merci pour cette astuce je vais essayer ça, je te tiens informer si ca fonctionne dans mon cas !
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  10. #10
    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
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par anthyme Voir le message
    pour ce qui est de juste utiliser des checkbox pour sélectionner ou non les objet j'ai utilisé cette approche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
    et ensuite je récupère tous mes objets sélectionnés dans ListView.SelectedItems
    Ce code permet de cocher les lignes sélectionnées, donc les CheckBox n'ont plus vraiment d'intérêt dans ce cas.
    Donc autant ne pas utiliser de CheckBox et sélectionner les différentes lignes pour ensuite faire le travail de suppression, de mise à jour sur ces lignes sélectionnées. Reste à savoir si ergonomiquement c'est ce que tu veux

  11. #11
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Citation Envoyé par binoo Voir le message
    Ce code permet de cocher les lignes sélectionnées, donc les CheckBox n'ont plus vraiment d'intérêt dans ce cas.
    Donc autant ne pas utiliser de CheckBox et sélectionner les différentes lignes pour ensuite faire le travail de suppression, de mise à jour sur ces lignes sélectionnées. Reste à savoir si ergonomiquement c'est ce que tu veux
    Tu penses trop technique, d'un point de vue ergonomique la faculté de cocher des checkbox est bien plus agréable que d'avoir a faire du controle Clic sur les lignes

  12. #12
    Membre habitué Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 183
    Points
    183
    Par défaut
    Bonjour,

    il y a bien un moyen de le faire avec le foreach, même si la solution n'est pas évidente :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                foreach (object oItem in maListe.Items)
                {
                    ListBoxItem oLBItem = (ListBoxItem)maListe.ItemContainerGenerator.ContainerFromItem(oItem);
                    if (oLBItem != null)
                    {
                        ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(oLBItem);
                        CheckBox oCB = (CheckBox)myContentPresenter.ContentTemplate.FindName("chbValid", myContentPresenter);
                        if (oCB != null)
                        {
                            bool? bChecked = oCB.IsChecked;
                        }
                    }
                }
            }
     
            private childItem FindVisualChild<childItem>(DependencyObject obj)
                where childItem : DependencyObject
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                    if (child != null && child is childItem)
                        return (childItem)child;
                    else
                    {
                        childItem childOfChild = FindVisualChild<childItem>(child);
                        if (childOfChild != null)
                            return childOfChild;
                    }
                }
                return null;
            }
    voilà, voilà...

  13. #13
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    merci beaucoup a toi Thrud je met ton code dans un petit coin mais niveau facilité je crois que je vais rester sur la solution de anthyme !! ;0)
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

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

Discussions similaires

  1. [DOM] Récupérer valeur dans un tableau html
    Par ViRouF dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 08/10/2008, 17h48
  2. Réponses: 3
    Dernier message: 08/08/2008, 20h14
  3. Réponses: 1
    Dernier message: 25/04/2007, 16h23
  4. Récupérer valeur dans une BD
    Par Matmal11 dans le forum Linux
    Réponses: 6
    Dernier message: 05/09/2006, 16h28
  5. Récupérer valeur dans un thread
    Par Nasky dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 07/06/2006, 21h37

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