2011-09-01 6 views
1

Lorsque j'ai une classe qui implémente INotifyPropertyChanged, est-il acceptable d'exposer l'implémentation en tant que méthode publique? Par exemple, si j'ai une propriété appelée "Sum" sur une classe, et que je veux cliquer sur un bouton dans l'interface utilisateur pour mettre à jour la somme, quelle est la meilleure façon de le faire?Meilleures pratiques INotifyPropertyChanged

est ci-dessous quelques pseudo-code pour illustrer ce que je veux dire

classinstance.NotifyPropertyChanged("Sum"); 
... 
public Sum { 
    get { return x + y + z; } 
} 

Répondre

1

Dans .Net la pratique préférée pour les méthodes qui déclenchent des événements est la méthode pour être déclarée comme protégée de sorte qu'il ne peut être appelé par classes dérivées (Ceci est dû au fait que seule la classe qui déclare l'événement peut le lever.Pour lever l'événement d'une classe dérivée, une méthode est nécessaire pour élever l'événement).

Par exemple ...

protected void OnPropertyChanged(string propertyName) 
{ 
    var handler = this.PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Cette méthode est alors appelée par la classe (ou classes dérivées) dans un setter de propriété pour indiquer qu'une propriété a changé, comme si ...

public object MyProperty 
{ 
    get { return _myProperty; } 
    set 
    { 
     _myProperty = value; 
     OnPropertyChanged("MyProperty"); 
    } 
} 

D'autres objets peuvent ensuite s'abonner à cet événement et seront notifiés chaque fois que la propriété MyProperty est modifiée.

Maintenant, pour répondre à votre question quant à savoir si la méthode OnPropertyChanged peut être publique. La réponse est oui mais vous devriez vous demander pourquoi cela serait le cas.

Pourquoi une autre classe sait-elle qu'une propriété a changé pour pouvoir appeler la méthode? s'il sait déjà quand la propriété a changé, vous n'avez pas besoin de vous abonner à l'événement changé de propriété en premier lieu! Seule la classe elle-même devrait «savoir» quand l'une de ses propres propriétés a changé.

Dans votre exemple, vous notifiez que la propriété 'sum' a été modifiée. mais ce n'est pas le cas. En fait, votre code n'autorise même pas la modification de cette propriété en dehors de sa propre classe.

Je suppose que vous voulez peut-être un moyen de notifier que la propriété sum doit être réévaluée car une propriété dépendante a été modifiée. Si tel est le cas, vous devez déclencher un événement de modification de propriété lorsque cette propriété dépendante change.

Imaginez que les modifications de la propriété « MyProperty » indiqué précédemment signifie également que « somme » a changé alors que serait traitée comme ceci:

// This property is used by the 'sum' property so if this changes 
// clients need to know that 'sum' has also changed. 
public object MyProperty 
{ 
    get { return _myProperty; } 
    set 
    { 
     _myProperty = value; 
     OnPropertyChanged("MyProperty"); 
     OnPropertyChanged("Sum"); 
    } 
}