Implementation de INotifyPropertyChanged - existe-t-il une meilleure methode ?

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

Implementation de INotifyPropertyChanged - existe-t-il une meilleure methode ?

Message par ForumBot »

Implementation de INotifyPropertyChanged - existe-t-il une meilleure methode ?

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

Re: Implementation de INotifyPropertyChanged - existe-t-il une meilleure methode ?

Message par ayi »

Sans utiliser quelque chose comme postsharp, la version minimale que nous utilisons ressemble a ceci :


public class Data : INotifyPropertyChanged
{
// boiler-plate
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetField<T>(ref T field, T value, string propertyName)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}

// props
private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}
}


Chaque propriete se resume alors a quelque chose comme :


private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}


ce qui n’est pas enorme ; cela peut egalement etre utilise comme classe de base si vous le souhaitez. Le retour bool de SetField vous indique si c’etait une operation sans effet, au cas ou vous voudriez appliquer une autre logique.


ou encore plus facilement avec C# 5 :


protected bool SetField<T>(ref T field, T value,
[CallerMemberName] string propertyName = null)
{...}


qui peut etre appele comme ceci :


set { SetField(ref name, value); }


avec quoi le compilateur ajoutera automatiquement "Name".


C# 6.0 rend l’implementation plus facile :


protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}


…et maintenant avec C#7 :


protected void OnPropertyChanged(string propertyName)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

protected bool SetField<T>(ref T field, T value,[CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(fiel


(Reponse tronquee)

Répondre

Revenir à « .NET & C# »