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

Framework .NET Discussion :

[WPF] Binding sur une collection : notifié sur MAJ d'un élément ?


Sujet :

Framework .NET

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 17
    Points : 10
    Points
    10
    Par défaut [WPF] Binding sur une collection : notifié sur MAJ d'un élément ?
    Bonjour, voilà encore une question sur le binding.

    Si je binde un contrôe sur un ObservableCollection<ClassA>.
    Je ne suis pas notifiée sur la modification d'une propriété d'un des éléments ClassA de ma collection, bien qu'elle implémente INotifyPropertyChanged.

    Quelle est la solution sachant que je suis obligée de ma binder sur la collection et non sur l'élément, car je ne connais pas par avance son index.

    Merci !!

  2. #2
    Membre régulier Avatar de despeludo
    Inscrit en
    Janvier 2004
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 121
    Points : 83
    Points
    83
    Par défaut
    Il ne faut oublier que les propriétés de ta classeA doivent être des DependencyProproperty pour que ces dernières puissent être mises à jour. Sinon, l'affichage ne se fera qu'une fois

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Euh, non le souci c'est que je binde sur l'ObservableCollection et donc le INotifyPropertyChanged de ma ClasseA n'est pas utilisé par le mécanisme de binding.
    Ce dernier s'occupe uniquement du INotifyCollectionChanged de l'ObservableCollection.

  4. #4
    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
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par sehshe Voir le message
    Euh, non le souci c'est que je binde sur l'ObservableCollection et donc le INotifyPropertyChanged de ma ClasseA n'est pas utilisé par le mécanisme de binding.
    Ce dernier s'occupe uniquement du INotifyCollectionChanged de l'ObservableCollection.
    Si ClassA implémente bien INotifyPropertyChanged, l'observablecollection utilise celle ClassA donc cela devrait marcher.....

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Le problème c'est l'utilisation d'un converter ?
    Au final, ça n’est pas lié à l’ObservableCollection.
    Il semble que le binding ne se fait pas si j’utilise un converter.
    J’ai isolé un exemple simple où je binde une instance de la classe Test à une textbox.text.

    Ma classe de test qui implémente : INotifyPropertyChanged
    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
     
        public class Test : INotifyPropertyChanged
        {
            private string m_Value;
     
            public string Value
            {
                get
                {
                    return m_Value;
                }
                set
                {
                    m_Value = value;
                    onPropertyChanged("Value");
                }
            }
     
            #region INotifyPropertyChanged Members
            public event PropertyChangedEventHandler PropertyChanged;
            event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
            {
                add
                {
                    PropertyChanged += value;
                }
                remove
                {
                    PropertyChanged -= value;
                }
            }
     
            protected void onPropertyChanged(string PropertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
     
     
            #endregion
        }
    Le binding d’un élément à une textbox « tbtest »
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
         Test test = new Test();
     
          Binding bind = new Binding("");
          bind.Mode = BindingMode.OneWay;
          bind.Converter = new TestConverter();
          tbtest.SetBinding(TextBox.TextProperty, bind);
          tbtest.DataContext = test;
    Le converter:
    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
     
    namespace D18WPFBindingLibtest
    {
        public class TestConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value == null)
                    return null;
     
     
                Test test = value as Test;
                return test.Value;
            }
     
            public object ConvertBack(object value, Type TargetType, object parameter, System.Globalization.CultureInfo culture)
            {
                    return null;
            }
        }
    }
    Maintenant, si je modifie test.Value via le code, ma textbox n'est pas rafraichie.
    Par-contre, si je force le refresh du binding à la main, par un Updatetarget() sur la binding expression, ma textbow se rafraichit correctement.

    Si je n'utilise pas le converter et que le Path de mon binding test.Value, le refresh fonctionne !


    Une idée ?
    Merci d’avance mille fois !

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 17
    Points : 10
    Points
    10
    Par défaut RESOLU !
    J'ai posté mon problème sur un autre forum et il a été résolu !!!
    http://forums.microsoft.com/Forums/S...iteID=1&mode=1


    Rapidement :

    Je binde la propriété DataContext de mon TextBox à ma collection -> le converter renvoie l'élément.
    Je binde la propriété Text de mon TextBox sur "Value", puisque mon binding sera relatif à celui du datacontext, c'est à dire à mon élément.

    IL SUFFISAIT DE PENSER A BINDER LE DATACONTEXT LUI-MEME !
    Et non pas d'essayer de tout faire avec le binding sur la propriété Text

    Je n'y avais pas pensé, c'est top !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/03/2014, 14h18
  2. [AC-2010] Simuler un clic sur une page web sur une image javascript
    Par alex en droit dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/04/2012, 13h22
  3. Imprimer sur une page web sur une imprimante spécifique
    Par bleuerouge dans le forum Windows Forms
    Réponses: 0
    Dernier message: 07/12/2009, 09h51
  4. Pb sur une requête DELETE sur une chaine
    Par astrolane dans le forum Sybase
    Réponses: 4
    Dernier message: 16/02/2009, 09h11
  5. Réponses: 3
    Dernier message: 25/10/2007, 11h47

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