Se puede utilizar un regulador de propiedad para provocar un evento cada vez que el valor de un campo va a cambiar.
Puede tener su propio delegado de EventHandler o puede usar el famoso delegado System.EventHandler.
Por lo general, hay un patrón para esto:
- definir un evento público con un delegado controlador de eventos (que tiene un argumento de tipo EventArgs).
- Defina un método virtual protegido llamado OnXXXXX (OnMyPropertyValueChanged por ejemplo). En este método, debe verificar si el delegado del controlador de eventos es nulo y si no puede llamarlo (significa que hay uno o más métodos asociados a la delegación del evento).
- Llame este método protegido siempre que desee notificar a los suscriptores que algo ha cambiado.
He aquí un ejemplo
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();
}
}
La ventaja de este enfoque es que deja que ninguna otra clase que quieren heredar de su clase con el fin de cambiar el comportamiento en caso de necesidad.
Si desea capturar un evento en un subproceso diferente que se está iniciando, debe tener cuidado de no cambiar el estado de los objetos definidos en otro subproceso lo que provocará que se genere una excepción de cadena cruzada. Para evitar esto, puede usar un método de Invoke en el objeto que desea cambiar su estado para asegurarse de que el cambio está sucediendo en el mismo hilo que el evento se ha planteado o en caso de que se trate de un formulario de Windows que puede usar un BackgourndWorker para hacer las cosas en un hilo paralelo agradable y fácil.
Para que quede claro, observando el cambio de una variable sólo es posible para una variable es el propietario (o lo que es ya IObservable/INotifyPropertyChanged/Event-related). No puede observar un cambio en la variable del sistema si no fue diseñado para ser observado. –