2009-10-22 4 views
2

J'ai certains contrôles de l'interface utilisateur qui utilisent la méthode DataBindings.Add, et cela fonctionne si je change la propriété de l'interface utilisateur spécifiée à la main ou si l'objet source est modifié à l'extérieur.WinDial DataBinding fonctionne-t-il pour les propriétés modifiées par programme?

Mais si j'appelle la valeur UI.Property = dans le code, cela ne modifie pas l'interface utilisateur ni l'objet source spécifié pour DataBindings.Add.

Qu'est-ce que je fais mal? Est-ce que je l'utilise incorrectement?

Répondre

8

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.

+0

Merci, je vais chercher des articles pour savoir comment l'implémenter. –

+1

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. –

+0

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? –

Questions connexes