C# Language
INotifyPropertyChanged-Schnittstelle
Suche…
Bemerkungen
Die Schnittstelle INotifyPropertyChanged
wird immer dann benötigt, wenn Ihre Klasse die Änderungen an ihren Eigenschaften melden soll. Die Schnittstelle definiert ein einzelnes Ereignis PropertyChanged
.
Mit XAML Binding wird das PropertyChanged
Ereignis automatisch verbunden, sodass Sie nur die INotifyPropertyChanged-Schnittstelle in Ihrem Ansichtsmodell oder in den Datenkontextklassen implementieren müssen, um mit XAML Binding arbeiten zu können.
Implementieren von INotifyPropertyChanged in C # 6
Die Implementierung von INotifyPropertyChange
kann fehleranfällig sein, da für die Schnittstelle der Eigenschaftsname als String angegeben werden muss. Um die Implementierung robuster zu gestalten, kann ein Attribut CallerMemberName
verwendet werden.
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;
}
Wenn Sie über mehrere Klassen INotifyPropertyChanged
, die INotifyPropertyChanged
implementieren, kann es hilfreich sein, die Schnittstellenimplementierung und die INotifyPropertyChanged
auf die allgemeine Basisklasse INotifyPropertyChanged
:
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 mit der Methode "Generic Set"
Die NotifyPropertyChangedBase
Klasse definiert eine generische Set-Methode, die von einem beliebigen abgeleiteten Typ aufgerufen werden kann.
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;
}
}
Um diese generische Set-Methode verwenden zu können, müssen Sie einfach eine Klasse erstellen, die von NotifyPropertyChangedBase abgeleitet ist.
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); }
}
}
Wie oben gezeigt, können Sie Set(ref _fieldName, value);
im Setter einer Eigenschaft, und es wird automatisch ein PropertyChanged-Ereignis ausgelöst, wenn es erforderlich ist.
Sie können sich dann beim PropertyChanged-Ereignis von einer anderen Klasse registrieren, die Eigenschaftsänderungen behandeln muss.
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;
}