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 :

Binding Checkbox dans une ListView


Sujet :

Windows Presentation Foundation

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 133
    Par défaut Binding Checkbox dans une ListView
    Bonjour !

    J'ai vu que je n'étais pas le seul à poser la question, mais je préfère expliquer mon cas de figure dans un nouveau post.

    J'ai un ListView dont le DataTemplate possède une CheckBox et des TextBlocks.
    Tout s'affiche correctement, par le binding ne semble pas fonctionner...
    Ce qui m'interpelle, c'est qu'en posant des points d'arrêt sur la méthode IsSelected, je me rends compte que les get & set ne sont jamais appelés, mais si je sors la CheckBox du DataTemplate pour la mettre autre part dans le code, le binding passe bien.
    Est-ce normal ? Comment dois-je procéder alors ?

    Le XAML de la ListView :

    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
     
    <ListView Height="250" Width="450" ItemsSource="{Binding Conferences, Mode=TwoWay}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                        <CheckBox Margin="0,0,5,0" IsChecked="{Binding IsSelected, Mode=TwoWay}"></CheckBox>
                        <TextBlock Text="{Binding id}" />
                        <TextBlock Text=" - " />
                        <TextBlock Text="{Binding titre}" />
                        <TextBlock Text=" - " />
                        <TextBlock Text="{Binding date}" />
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    Le code de IsSelected dans mon ViewModel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private bool _isSelected;
    // ...
    public bool IsSelected
            {
                get { return _isSelected; }
                set
                {
                    _isSelected = value;
                    OnPropertyChanged("IsSelected");
                    if (value != false)
                      // Instructions
                }
            }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    Bonjour,

    Question : le ViewModel c'est celui de la listview ou celui des items de ta liste?

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 133
    Par défaut
    Citation Envoyé par NejNej Voir le message
    Bonjour,

    Question : le ViewModel c'est celui de la listview ou celui des items de ta liste?

    La partie de code de ViewModel que j'ai collé c'est celui qui est utilisé dans le binding de la CheckBox de la ListView, la méthode qui est est bindé à la propriété ItemsSource est appelée Conference.

  4. #4
    Membre éprouvé Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Par défaut
    Bonjour,

    Ta ListView est bindée sur Conference, ce qui fait que les enfants de ta ListView héritent de ce contexte. Ainsi, la propriété IsChecked est "recherchée" dans le contexte Conference et d'après ce que tu dis, il me semble qu'il n'y ait pas de tel attribut dans Conference.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 133
    Par défaut
    Merci titourock, ça confirme ce que je pensais.
    Mais du coup, en MVVM, comment puis-je faire pour accéder au DataContext de la CheckBox ?

    Je devrais peut-être tout passer dans le XAML alors, parce que j'ai l'habitude de faire mes assignations de DataContext de la manière suivante en MVVM :

    dans le monTitreView.cs, après avoir rajouté le using adéquat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    monTitreViewModel = new monTitreViewModel();
    this.DataContext = monTitreViewModel;

  6. #6
    Membre éprouvé Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Par défaut
    Bonjour,

    Pourrais-tu donner le code de ton ViewModel ? Cela serait plus simple pour te répondre

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 133
    Par défaut
    Bien sûr !
    L'idéal serait en fait de mettre en DataContext de la CheckBox ce ViewModel, via XAML.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Input;
    using GalaSoft.MvvmLight.Command;
     
    namespace MSClient.ViewModels.Audio
    {
        /// <summary>
        /// Fournit une liste de conférences afin d'en supprimer une ou plusieurs
        /// </summary>
        class DeleteAudioViewModel : BaseViewModel
        {
            #region Variables
            private List<AUDIOCONFERENCES> _audioconferences;
            private AUDIOCONFERENCES _selectedItem;
            private List<AUDIOCONFERENCES> _selectedConferences;
            private MSClient.Model.MultimediaServicesModel msModel;
            private bool _isSelected;
            private bool _pastChecked;
            private bool _toComeChecked;
            private bool _allChecked;
            #endregion
            #region Constructor
            public DeleteAudioViewModel()
            {
                msModel = new Model.MultimediaServicesModel();
                _audioconferences = msModel.GetAll<AUDIOCONFERENCES>().ToList();
                _selectedConferences = new List<AUDIOCONFERENCES>();
                // Erase comments to unlock the command
                //DeleteCommand = new RelayCommand(ExecuteDeleteCommand, CanExecuteDeleteCommand);
            }
            #endregion
            #region getters & setters
            public List<AUDIOCONFERENCES> Audioconferences
            {
                get { return _audioconferences; }
                set { _audioconferences = value; OnPropertyChanged("Audioconferences"); }
            }
            public AUDIOCONFERENCES SelectedItem
            {
                get { return _selectedItem; }
                set { _selectedItem = value; OnPropertyChanged("SelectedItem"); }
            }
            public List<AUDIOCONFERENCES> SelectedConferences
            {
                get { return _selectedConferences; }
                set { _selectedConferences = value; OnPropertyChanged("SelectedConferences"); }
            }
            public bool ToComeChecked
            {
                get { return _toComeChecked; }
                set
                {
                    _toComeChecked = value;
                    OnPropertyChanged("ToComeChecked");
                    if (value != false)
                    {
                        _audioconferences = msModel.GetById<AUDIOCONFERENCES>(c => c.date.Value.CompareTo(DateTime.Now) >= 0).ToList();
                        OnPropertyChanged("Audioconferences");
                    }
                }
            }
            public bool PastChecked
            {
                get { return _pastChecked; }
                set
                {
                    _pastChecked = value;
                    OnPropertyChanged("PastChecked");
                    if (value != false)
                    {
                        _audioconferences = msModel.GetById<AUDIOCONFERENCES>(c => c.date.Value.CompareTo(DateTime.Now) < 0).ToList();
                        OnPropertyChanged("Audioconferences");
                    }
                }
            }
            public bool AllChecked
            {
                get { return _allChecked; }
                set
                {
                    _allChecked = value;
                    OnPropertyChanged("AllChecked");
                    if (value != false)
                    {
                        _audioconferences = msModel.GetAll<AUDIOCONFERENCES>().ToList();
                        OnPropertyChanged("Audioconferences");
                    }
                }
            }
            public bool IsSelected
            {
                get { return _isSelected; }
                set
                {
                    _isSelected = value;
                    OnPropertyChanged("IsSelected");
                    if (value != false)
                        _selectedConferences.Add(_selectedItem);
                    else _selectedConferences.Remove(_selectedItem);
                }
            }
            #endregion
     
            #region Commandes
            public ICommand DeleteCommand;
            public void ExecuteDeleteCommand()
            {
                foreach (AUDIOCONFERENCES audioconference in _selectedConferences)
                {
                    msModel.Delete(audioconference);
                }
                msModel.Commit();
            }
            public bool CanExecuteDeleteCommand()
            {
                return _selectedConferences != null;
            }
            #endregion
     
     
        }
    }

  8. #8
    Membre éprouvé Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Par défaut
    Quelquechose m'intrigue...Je ne vois nulle part ton objet Conferences qui contient tes attributs id,titres et date. C'est également lui qui doit contenir ton IsSelected.

    De plus, j'ai l'impression que tu n'as qu'un seul attribut IsSelected pour toutes tes checkboxs...mais je peux me trompe peut-être...

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 133
    Par défaut
    Mea culpa, j'avais simplifié le code dans mes précédents posts, le code réel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <ListView Height="250" Width="450" ItemsSource="{Binding Audioconferences}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                        <CheckBox Name="box"  Margin="0,0,5,0" IsChecked="{Binding IsSelected}" DataContext="{StaticResource ResourceKey=DeleteAudioViewModel}"></CheckBox>
                        <TextBlock Text="{Binding id_audio}" />
                        <TextBlock Text=" - " />
                        <TextBlock Text="{Binding titre}" />
                        <TextBlock Text=" - " />
                        <TextBlock Text="{Binding date}" />
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    En assignant de dataContext en XAML, je parviens à arriver dans mon ViewModel lors de la sélection d'une CheckBox, sans pour l'instant arriver à gérer son comportement (toutes les autres CheckBox s'updatent à true évidemment quand j'en sélectionne une). C'est effectivement dû au fait que je n'ai qu'une méthode IsSelected pour toutes mes CheckBox, mais je ne vois pas comment procéder autrement.
    J'ai autant de CheckBox que de lignes dans la Liste, donc vraiment beaucoup.

  10. #10
    Membre éprouvé Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Par défaut
    Ta listview doit afficher un liste d'éléments et ces éléments provienent de ton contexte de données (DataContext) i.e chaque objet de ton DataContext va engendrer la création d'un élément dans ton UI.

    Audioconferences devrait donc être de type List<Audioconference>Audioconference est une classe contenant les attributs id_audio,titre, date et IsChecked.

    Ainsi chaque checkbox a "son" IsSelected ...Tu peux également via cela mettre une commande sur chaque checkbox au lieu d'utiliser IsSelected .

  11. #11
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 133
    Par défaut
    Si je remplace Audioconferences par une List<Audioconference>, comment la ListView pourra-t-elle récupérer les lignes sélectionnées ?

    Aussi, c'est du coup un peu compliqué d'ajouter un attribut IsChecked à la classe audioconférence, qui est une classe générée par Linq to SQL à partir d'une base de données :/

  12. #12
    Membre éprouvé Avatar de titourock
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 156
    Par défaut
    Pour les sélections courantes je te conseille fortement d'utiliser une vue de ta collection i.e de type ICollectionView. Cette interface (et donc les classes qui l'implémentent) permettent d'obtenir la sélection courante, de filtrer, trier...Il y a un article sur developpez ici.

    Pour résumer : tu auras donc une liste "brute" ne représentant que tes données et une vue de cette liste s'occupant de savoir qui dans tes éléments est sélectionné, quel filtre ou tri appliquer etc...

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 133
    Par défaut
    En effet cette interface semble plus adaptée que ma méthode détournée !
    Merci de m'avoir guidé, je fais potasser ça et je reviendrai poster ensuite !

Discussions similaires

  1. Tester les checkBox dans une listview avecun SimpleCursorAdapter
    Par link953 dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 10/02/2014, 01h05
  2. Récupérer la valeur d'une Checkbox dans une ListView
    Par LHsafae dans le forum Développement Mobile en Java
    Réponses: 1
    Dernier message: 21/02/2013, 13h14
  3. [AC-2007] Contrôle checkbox dans une listview
    Par facedeharicot dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/07/2011, 10h46
  4. [C#] Checkbox dans une Listview : Toujours à false
    Par DébutantPgm dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 24/05/2010, 23h57
  5. Réponses: 3
    Dernier message: 23/04/2009, 00h56

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