c# - inotification - ¿cómo funciona PropertyChangedEventHandler?
raise event on property change c# (3)
PropertyChanged
es el evento que fue declarado así, de acuerdo con su definición en la interfaz:
public event PropertyChangedEventHandler PropertyChanged;
Los eventos que se definen así son en realidad un azúcar sintáctico para una lista de manejadores de eventos a los que se puede agregar un delegado (que es una referencia a una función) al suscribirse, o eliminar un delegado anulando la suscripción.
Ahora, cuando se llama a un evento, es decir, PropertyChanged(...)
, lo que sucede internamente es que cada delegado en esa lista interna se llama por separado con los parámetros. Esto les dirá a todos los suscriptores de su evento que sucedió el evento.
Ahora, la razón para todo el asunto con la variable del handler
es que PropertyChanged
puede ser nulo. Si no hay nada suscrito, entonces llamar al evento (o más bien a la lista de controladores de eventos) no funcionaría, por lo que esta es solo una forma de garantizar que realmente pueda ejecutar el controlador.
Esta es una pregunta realmente simple, pero me preguntaba si alguien podría explicar lo que realmente está haciendo la 4ª línea. entonces la primera línea le da un evento al manejador. Realmente no sé en qué circunstancias el manejador devolverá nulo o lo que hace la última línea.
Cuando pasas el manejador a tu objeto y qué propiedad cambia, ¿qué hace con ellos?
PropertyChangedEventHandler handler = PropertyChanged; //property changed is the event
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
Supongo que utilicé esto para obtener este código pero me gustaría entender qué está haciendo completamente.
handler
puede ser nulo si no se suscriben controladores al evento , la cuarta línea plantea el evento para el nombre de propiedad dado (que ejecuta todos los manejadores suscritos).
Por lo general, el marco WPF se suscribirá a PropertyChanged
cuando utiliza enlaces, por lo que puede actualizar el enlace una vez que cambia la propiedad vinculada.
Si acabas de hacer:
PropertyChanged(this, new PropertyChangedEventArgs(name))
obtendrías una NullReferenceException
si nadie estaba suscrito al evento PropertyChanged
. Para contrarrestar esto, agrega una verificación nula:
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name))
}
Ahora, si está utilizando multi-threading alguien podría darse de baja entre la verificación nula y la llamada del evento, por lo que aún podría obtener una NullReferenceException
. Para manejar eso copiamos el controlador de eventos a una variable temporal
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
Ahora, si alguien anula la suscripción al evento, nuestro handler
variables temporales aún apuntará a la función anterior y este código ahora no tiene forma de arrojar una NullReferenceException
.
Muy a menudo verá que las personas usan la palabra clave var
lugar, esto hace que no sea necesario escribir el tipo completo de la variable temporal, este es el formulario que verá más a menudo en el código.
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}