Sie können einen Eigenschaftssetter verwenden, um ein Ereignis auszulösen, wenn sich der Wert eines Felds ändert.
Sie können Ihren eigenen EventHandler-Delegaten haben oder den berühmten System.EventHandler-Delegaten verwenden.
Normalerweise gibt es dafür ein Muster:
- Definieren Sie ein öffentliches Ereignis mit einem Event-Handler-Delegaten (der ein Argument vom Typ EventArgs hat).
- Definieren Sie eine geschützte virtuelle Methode namens OnXXXXX (z. B. OnMyPropertyValueChanged). Bei dieser Methode sollten Sie überprüfen, ob der Event-Handler-Delegat null ist, und wenn nicht, können Sie ihn aufrufen (dies bedeutet, dass der Event-Delegation eine oder mehrere Methoden zugeordnet sind).
- Rufen Sie diese geschützte Methode auf, wenn Sie Abonnenten benachrichtigen möchten, dass sich etwas geändert hat.
Hier ist ein Beispiel
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();
}
}
Der Vorteil dieses Ansatzes besteht darin, dass Sie alle anderen Klassen, die von Ihrer Klasse erben möchten, bei Bedarf das Verhalten ändern lassen.
Wenn Sie ein Ereignis in einem anderen Thread abfangen möchten, das ausgelöst wird, müssen Sie darauf achten, den Status von Objekten, die in einem anderen Thread definiert sind, nicht zu ändern, da dadurch eine Thread-übergreifende Ausnahme ausgelöst wird. Um dies zu vermeiden, können Sie entweder eine Invoke-Methode für das Objekt verwenden, dessen Status Sie ändern möchten, um sicherzustellen, dass die Änderung in demselben Thread erfolgt, in dem das Ereignis ausgelöst wurde, oder für den Fall, dass Sie mit einem Windows Form arbeiten kann einen BackgourndWorker verwenden, um Dinge in einem parallelen Thread nett und einfach zu erledigen.