Le contrôle ne saura pas que quelque chose a changé à moins que l'objet implémente INotifyPropertyChanged
. Ensuite, le setter de propriété dans l'objet est modifié pour déclencher l'événement PropertyChanged
, en transmettant le nom de la propriété qui a été modifiée dans les arguments d'événement.
INotifyPropertyChanged
est une interface particulière que le mécanisme de liaison de données de WinForms recherche lors du câblage de la liaison de données. S'il voit un objet qui implémente cette interface, il s'abonnera à son événement, et vous verrez votre interface utilisateur actualisée automatiquement sans avoir à dire aux liaisons de données de relire leurs valeurs (ce qui se passe si vous réaffectez le DataSource
, etc.).
Pas évident, mais c'est logique quand on y pense. Sans qu'un événement soit diffusé, comment le contrôle de l'interface utilisateur sait-il que la propriété a changé? Il n'y a pas de sondage de la propriété de temps en temps. Il doit être dit que la propriété a changé, et l'événement PropertyChanged
est la façon conventionnelle de le faire.
Quelque chose comme (code non compilé) ...
public class MyInterestingObject : INotifyPropertyChanged
{
private int myInterestingInt;
public event PropertyChangedEventHandler PropertyChanged;
public int MyInterestingInt
{
get { return this.myInterestingInt; }
set
{
if (value != this.myInterestingInt)
{
this.myInterestingInt = value;
this.RaisePropertyChanged("MyInterestingInt");
}
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Maintenant, tout code qui a une liaison de données à MyInterestingInt
propriété de cet objet se met à jour lorsque cette propriété est modifiée. (Certaines personnes préfèrent implémenter cette interface pour elles.)
Une mise en garde: assurez-vous de définir la valeur mise à jour avant de déclencher l'événement PropertyChanged
! C'est facile à faire et peut vous laisser vous gratter la tête pour savoir pourquoi la valeur n'est pas mise à jour.
Merci, je vais chercher des articles pour savoir comment l'implémenter. –
Bien sûr, j'ai ajouté un exemple. MSDN en parle également à http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx. Bonne chance. –
Merci Nicholas. J'ai 2 questions: 1. PropertyChangedEventArgs peut prendre n'importe quel type? 2. Cette liaison me permettra également de changer l'interface utilisateur et de mettre l'objet à jour aussi, non? –