Ви можете використовувати установку властивостей, щоб викликати подію, коли значення поля буде змінюватися.
Ви можете мати власного делегата EventHandler або скористатися відомим делегатом System.EventHandler.
Зазвичай для цього існує шаблон:
- Визначте публічну подію за допомогою делегата обробника подій (який має аргумент типу EventArgs).
- Визначте захищений віртуальний метод, який називається OnXXXXX (наприклад, OnMyPropertyValueChanged). У цьому методі ви повинні перевірити, чи делегат обробника подій є нульовим, і якщо ні, то ви можете його викликати (це означає, що до делегування події приєднано один або кілька методів).
- Зателефонуйте до цього захищеного методу, коли хочете повідомити абонентів про те, що щось змінилося.
Ось приклад
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();
}
}
Перевага цього підходу полягає в тому, що ви дозволяєте будь-яким іншим класам, які хочуть успадкувати ваш клас, змінювати поведінку, якщо це необхідно.
Якщо ви хочете зафіксувати подію в іншому потоці, який він викликає, ви повинні бути обережними, щоб не змінити стан об'єктів, визначених в іншому потоці, що призведе до виникнення винятку між крос-потоками. Щоб уникнути цього, ви можете використати метод Invoke на об'єкті, для якого потрібно змінити його стан, щоб переконатись, що зміна відбувається в тому самому потоці, що і подія, що викликається, або у випадку, якщо ви маєте справу з формою Windows, яку ви можна використовувати BackgourndWorker, щоб робити речі в паралельній темі приємно і просто.