C# Language
Interface INotifyPropertyChanged
Recherche…
Remarques
L'interface INotifyPropertyChanged
est nécessaire chaque fois que vous avez besoin de faire en sorte que votre classe signale les modifications apportées à ses propriétés. L'interface définit un événement unique PropertyChanged
.
Avec XAML, la liaison de l'événement PropertyChanged
est automatiquement configurée. Vous n'avez donc qu'à implémenter l'interface INotifyPropertyChanged sur votre modèle de vue ou sur les classes de contexte de données pour travailler avec XAML Binding.
Implémenter INotifyPropertyChanged en C # 6
L'implémentation de INotifyPropertyChange
peut être INotifyPropertyChange
erreurs, car l'interface nécessite de spécifier le nom de la propriété en tant que chaîne. Afin de rendre l'implémentation plus robuste, un attribut CallerMemberName
peut être utilisé.
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 vous avez plusieurs classes implémentant INotifyPropertyChanged
, vous pouvez trouver utile de refactoriser l'implémentation de l'interface et la méthode d'assistance dans la classe de base commune:
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 Avec la méthode d'ensemble générique
La classe NotifyPropertyChangedBase
ci-dessous définit une méthode Set générique pouvant être appelée à partir de n'importe quel type dérivé.
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;
}
}
Pour utiliser cette méthode Set générique, il vous suffit de créer une classe dérivée 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); }
}
}
Comme indiqué ci-dessus, vous pouvez appeler Set(ref _fieldName, value);
dans le setter d'une propriété et il déclenchera automatiquement un événement PropertyChanged si nécessaire.
Vous pouvez ensuite vous inscrire à l'événement PropertyChanged à partir d'une autre classe qui doit gérer les modifications de propriété.
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;
}