C# Language
Interfaz INotifyPropertyChanged
Buscar..
Observaciones
La interfaz INotifyPropertyChanged
es necesaria siempre que necesite hacer que su clase informe los cambios que ocurren en sus propiedades. La interfaz define un único evento PropertyChanged
.
Con el enlace XAML, el evento PropertyChanged
se conecta automáticamente, por lo que solo necesita implementar la interfaz INotifyPropertyChanged en su modelo de vista o clases de contexto de datos para trabajar con el enlace XAML.
Implementando INotifyPropertyChanged en C # 6
La implementación de INotifyPropertyChange
puede ser propensa a errores, ya que la interfaz requiere especificar el nombre de la propiedad como una cadena. Para hacer que la implementación sea más robusta, se puede usar un atributo CallerMemberName
.
class C : INotifyPropertyChanged
{
// backing field
int offset;
// property
public int Offset
{
get
{
return offset;
}
set
{
if (offset == value)
return;
offset = value;
RaisePropertyChanged();
}
}
// helper method for raising PropertyChanged event
void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
// interface implemetation
public event PropertyChangedEventHandler PropertyChanged;
}
Si tiene varias clases que implementan INotifyPropertyChanged
, puede que le resulte útil refactorizar la implementación de la interfaz y el método auxiliar a la clase base común:
class NotifyPropertyChangedImpl : INotifyPropertyChanged
{
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
// interface implemetation
public event PropertyChangedEventHandler PropertyChanged;
}
class C : NotifyPropertyChangedImpl
{
int offset;
public int Offset
{
get { return offset; }
set { if (offset != value) { offset = value; RaisePropertyChanged(); } }
}
}
INotifyPropertyChanged con método de conjunto genérico
La clase NotifyPropertyChangedBase
continuación define un método de conjunto genérico al que se puede llamar desde cualquier tipo derivado.
public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public event PropertyChangedEventHandler PropertyChanged;
public virtual bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (Equals(field, value))
return false;
storage = value;
RaisePropertyChanged(propertyName);
return true;
}
}
Para usar este método de set genérico, simplemente necesita crear una clase que derive de NotifyPropertyChangedBase.
public class SomeViewModel : NotifyPropertyChangedBase
{
private string _foo;
private int _bar;
public string Foo
{
get { return _foo; }
set { Set(ref _foo, value); }
}
public int Bar
{
get { return _bar; }
set { Set(ref _bar, value); }
}
}
Como se muestra arriba, puede llamar a Set(ref _fieldName, value);
en el establecedor de una propiedad y automáticamente generará un evento PropertyChanged si es necesario.
Luego, puede registrarse en el evento PropertyChanged de otra clase que necesita para manejar los cambios de propiedad.
public class SomeListener
{
public SomeListener()
{
_vm = new SomeViewModel();
_vm.PropertyChanged += OnViewModelPropertyChanged;
}
private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine($"Property {e.PropertyName} was changed.");
}
private readonly SomeViewModel _vm;
}