Możesz użyć metody ustawiającej właściwości, aby zgłosić zdarzenie za każdym razem, gdy wartość pola ulegnie zmianie.
Możesz mieć własnego delegata EventHandler lub możesz użyć słynnego delegata System.EventHandler.
Zwykle jest na to wzór:
- Zdefiniuj zdarzenie publiczne z delegatem programu obsługi zdarzeń (który ma argument typu EventArgs).
- Zdefiniuj chronioną metodę wirtualną o nazwie OnXXXXX (na przykład OnMyPropertyValueChanged). W tej metodzie należy sprawdzić, czy delegat obsługi zdarzeń ma wartość NULL, a jeśli nie, można go wywołać (oznacza to, że do delegacji zdarzenia jest dołączona jedna lub więcej metod).
- Wywołaj tę chronioną metodę, gdy chcesz powiadomić subskrybentów, że coś się zmieniło.
Oto przykład
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();
}
}
Zaletą tego podejścia jest to, że pozwalasz innym klasom, które chcą dziedziczyć z Twojej klasy, na zmianę zachowania, jeśli to konieczne.
Jeśli chcesz złapać zdarzenie w innym wątku, który jest wywoływany, musisz uważać, aby nie zmienić stanu obiektów, które są zdefiniowane w innym wątku, co spowoduje zgłoszenie wyjątku między wątkami. Aby tego uniknąć, możesz użyć metody Invoke na obiekcie, który chcesz zmienić jego stan, aby upewnić się, że zmiana zachodzi w tym samym wątku, w którym zostało zgłoszone zdarzenie, lub w przypadku, gdy masz do czynienia z formularzem systemu Windows może używać BackgourndWorker do wykonywania czynności w równoległym wątku w łatwy i przyjemny sposób.