C# Language
INotifyPropertyChanged-interface
Zoeken…
Opmerkingen
De interface INotifyPropertyChanged
is nodig wanneer u uw klasse de wijzigingen in zijn eigenschappen wilt laten rapporteren. De interface definieert een enkele gebeurtenis PropertyChanged
.
Met XAML Binding wordt de PropertyChanged
gebeurtenis automatisch aangesloten, zodat u alleen de INotifyPropertyChanged-interface in uw viewmodel of gegevenscontextklassen hoeft te implementeren om met XAML Binding te werken.
Implementeren van INotifyPropertyChanged in C # 6
De implementatie van INotifyPropertyChange
kan foutgevoelig zijn, omdat de interface de eigenschapsnaam als een tekenreeks moet opgeven. Om de implementatie robuuster te maken, kan een kenmerk CallerMemberName
worden gebruikt.
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;
}
Als u verschillende klassen implementeert die INotifyPropertyChanged
implementeren, kan het handig zijn om de interface-implementatie en de INotifyPropertyChanged
voor de algemene basisklasse:
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 With Generic Set Method
De NotifyPropertyChangedBase
klasse NotifyPropertyChangedBase
definieert een generieke Set-methode die vanuit elk afgeleid type kan worden aangeroepen.
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;
}
}
Om deze generieke Set-methode te gebruiken, hoeft u alleen maar een klasse te maken die is afgeleid van INFORMPropertyChangedBase.
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); }
}
}
Zoals hierboven getoond, kunt u Set(ref _fieldName, value);
aanroepen Set(ref _fieldName, value);
in de setter van een eigenschap en deze zal automatisch een PropertyChanged-gebeurtenis activeren als deze nodig is.
U kunt zich vervolgens registreren voor de PropertyChanged-gebeurtenis van een andere klasse die eigenschapsveranderingen moet verwerken.
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;
}