La interfaz INotifyPropertyChanged
es implementada con eventos. La interfaz tiene solo un miembro, PropertyChanged
, que es un evento al que los consumidores pueden suscribirse.
La versión que publicó Richard no es segura. Aquí es cómo implementar esta interfaz segura:
public class MyClass : INotifyPropertyChanged
{
private string imageFullPath;
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, e);
}
protected void OnPropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public string ImageFullPath
{
get { return imageFullPath; }
set
{
if (value != imageFullPath)
{
imageFullPath = value;
OnPropertyChanged("ImageFullPath");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Tenga en cuenta que esto hace las siguientes cosas:
Abstracts los métodos de notificación de cambio de la propiedad para que pueda aplicar fácilmente esto a otras propiedades;
hace una copia de la PropertyChanged
delegado antes intentar invocarlo (no hacer esto creará una condición de carrera).
Implementa correctamente la interfaz INotifyPropertyChanged
.
Si desea , además, crear una notificación para una propiedad específica ser cambiado, puede agregar el siguiente código:
protected void OnImageFullPathChanged(EventArgs e)
{
EventHandler handler = ImageFullPathChanged;
if (handler != null)
handler(this, e);
}
public event EventHandler ImageFullPathChanged;
A continuación, agregue la línea OnImageFullPathChanged(EventArgs.Empty)
después de la línea OnPropertyChanged("ImageFullPath")
.
Ya tenemos .Net 4.5 existe la CallerMemberAttribute
, que permite deshacerse de la cadena codificada por el nombre de la propiedad en el código fuente:
protected void OnPropertyChanged(
[System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public string ImageFullPath
{
get { return imageFullPath; }
set
{
if (value != imageFullPath)
{
imageFullPath = value;
OnPropertyChanged();
}
}
}
+1 por ser la única persona en este hilo hasta el momento para obtener la comprobación nula del evento correcto. –
@Aaronaught: ¿Cómo conectar el método del evento con el evento ?, ¿podría explicarme? Quiero decir, ¿dónde debo escribir la implementación para el evento? – dotNETbeginner
¿Por qué usar el "manejador" var local, por qué no solo if (ImageFullPathChanged! = Null) ImageFullPathChanged (esto, e); – dlchambers