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 :

Rafraichissement d'un DataGrid après modification d'un élément d'une liste


Sujet :

Windows Presentation Foundation

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut Rafraichissement d'un DataGrid après modification d'un élément d'une liste
    Bonjour

    J'ai la le dataGrid suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <DataGrid ItemsSource="{Binding SwitchService.Switches}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Id}" Header="ID" />
            <DataGridTextColumn Binding="{Binding SwitchName}" Header="Name" />
            <DataGridCheckBoxColumn Binding="{Binding SwitchState}" Header="State" />
       </DataGrid.Columns>
    </DataGrid>
    Switches est une collection de type ObservableCollection<Switch>.
    Et Switch est une classe contenant diverses propriétés affichées dans mon DataGrid.
    Les propriétés des éléments contenus dans la collection sont mises à jour périodiquement.

    Mon problème est que ma vue ne se met pas à jour lorsqu'une propriété est modifiée. Après quelques recherche j'ai compris que ObservableCollection ne notifie un changement qu'en cas de suppression, ajout, ... d'un élément. Ceci m’amène à ma première question : est-ce que ObservableCollection est le type approprié dans mon cas ? A priori je dirais non, une fois ma collection initialisée, elle ne change plus, ce sont uniquement les valeurs des propriétés des objets contenus dans ma collection qui peuvent être modifiées.

    Deuxième question : comment faire pour rafraichir mon dataGrid ? Dois-je implémenter INotifyPropertyChanged dans ma classe Switch, ou y a-t-il une autre solution.

    Cordialement

    Julien

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par JuTs Voir le message
    Mon problème est que ma vue ne se met pas à jour lorsqu'une propriété est modifiée. Après quelques recherche j'ai compris que ObservableCollection ne notifie un changement qu'en cas de suppression, ajout, ... d'un élément. Ceci m’amène à ma première question : est-ce que ObservableCollection est le type approprié dans mon cas ? A priori je dirais non, une fois ma collection initialisée, elle ne change plus, ce sont uniquement les valeurs des propriétés des objets contenus dans ma collection qui peuvent être modifiées.
    Si la collection ne va pas changer, il n'est pas nécessaire d'utiliser ObservableCollection. Cela dit, ça ne coute pas grand chose, donc tu peux laisser comme ça. Peut-être qu'un jour tu auras besoin d'ajouter ou d'enlever des éléments à la volée.

    Citation Envoyé par JuTs Voir le message
    Deuxième question : comment faire pour rafraichir mon dataGrid ? Dois-je implémenter INotifyPropertyChanged dans ma classe Switch, ou y a-t-il une autre solution.
    Oui, il faut implémenter cette interface et déclencher l'événement PropertyChanged à chaque fois qu'une propriété est modifiée. Cela notifie le binding qu'il doit se rafraichir.

    Perso j'utilise souvent la classe de base suivante pour les classes qui doive implémenter INotifyPropertyChanged :

    Code C# : 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
    public class ObservableBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
     
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
     
        protected bool Set<T>(ref T field, T newValue, [CallerMemberName] string propertyName = null)
        {
            if (EqualityComparer<T>.Default.Equals(field, newValue))
                return false;
     
            field = newValue;
            OnPropertyChanged(propertyName);
            return true;
        }
    }

    (l'utilisation de CallerMemberName nécessite C# 5; ça permet de passer implicitement le nom de la propriété)

    Tu peux ensuite implémenter tes propriétés comme ceci :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private string _switchState;
    public string SwitchState
    {
        get { return _switchState; }
        set { Set(ref _switchState, value); }
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Parfait, merci.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/05/2011, 17h30
  2. Formulaire spécifique de modification d'un élément d'une liste
    Par hopla.hansele dans le forum SharePoint
    Réponses: 0
    Dernier message: 21/05/2008, 19h35
  3. Modification du contexte d'appel à une liste.
    Par fastlock dans le forum W4 Express
    Réponses: 1
    Dernier message: 18/09/2007, 16h53
  4. Réponses: 2
    Dernier message: 05/12/2006, 17h00
  5. Modification d'un élément dans une CList
    Par nmarf dans le forum MFC
    Réponses: 4
    Dernier message: 03/05/2006, 16h57

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