Вы можете использовать установщик свойств, чтобы вызывать событие всякий раз, когда значение поля будет меняться.
Вы можете иметь свой собственный делегат 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, чтобы делать вещи в параллельном потоке красиво и легко.