Vous pouvez utiliser un définisseur de propriété pour déclencher un événement lorsque la valeur d'un champ va changer.
Vous pouvez avoir votre propre délégué EventHandler ou vous pouvez utiliser le célèbre délégué System.EventHandler.
En général, il y a un modèle pour ça :
- Définissez un événement public avec un délégué de gestion d'événement (qui a un argument de type EventArgs).
- Définissez une méthode virtuelle protégée appelée OnXXXXX (OnMyPropertyValueChanged par exemple). Dans cette méthode, vous devez vérifier si le délégué du gestionnaire d'événement est nul et si ce n'est pas le cas, vous pouvez l'appeler (cela signifie qu'il y a une ou plusieurs méthodes attachées à la délégation d'événement).
- Appelez cette méthode protégée chaque fois que vous voulez informer les abonnés que quelque chose a changé.
Voici un exemple
private int _age;
//#1
public event System.EventHandler AgeChanged;
//#2
protected virtual void OnAgeChanged()
{
if (AgeChanged != null) AgeChanged(this,EventArgs.Empty);
}
public int Age
{
get
{
return _age;
}
set
{
//#3
_age=value;
OnAgeChanged();
}
}
L'avantage de cette approche est que vous permettez à toute autre classe qui souhaite hériter de votre classe de modifier le comportement si nécessaire.
Si vous voulez attraper un événement dans un thread différent de celui où il est levé, vous devez faire attention à ne pas changer l'état des objets qui sont définis dans un autre thread, ce qui entraînerait la levée d'une exception inter-thread. Pour éviter cela, vous pouvez soit utiliser une méthode Invoke sur l'objet dont vous voulez changer l'état pour vous assurer que le changement a lieu dans le même thread que l'événement a été soulevé, soit, si vous avez affaire à un formulaire Windows, utiliser un BackgourndWorker pour faire les choses dans un thread parallèle de manière simple et efficace.
1 votes
Pour être clair, observer le changement d'une variable n'est possible que pour une variable que vous possédez (ou qui est déjà liée à IObservable/INotifyPropertyChanged/Event). Vous ne pouvez pas observer le changement d'une variable système si elle n'a pas été conçue pour être observée.