Je vois deux types d'implémentation de INotifyPropertyChanged
Le premier:
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Le deuxième:
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Dans le deuxième, vous voyez qu'il y a un attribut supplémentaire [NotifyPropertyChangedInvocator]
sur la méthode OnPropertyChanged
Dans mon cas, les deux se comportent de la même façon, mais quoi, pourquoi et quand utiliser ce [NotifyPropertyChangedInvocator]
, quels en sont les avantages? J'ai cherché sur Internet mais je n'ai pas trouvé de bonne réponse.
C'est un attribut Resharper de leur Annotations - conçu pour vous donner un avertissement alors votre code semble suspect :)
Considère ceci:
public class Foo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void NotifyChanged(string propertyName) { ... }
private string _name;
public string Name {
get { return _name; }
set {
_name = value;
NotifyChanged("LastName");//<-- warning here
}
}
}
Avec le [NotifyPropertyChangedInvocator]
attribut sur la méthode NotifyChanged
Resharper vous avertira que vous invoquez la méthode avec une valeur (vraisemblablement) erronée .
Parce que Resharper sait maintenant que la méthode que doit être appelée pour effectuer une notification de modification, elle vous aidera à convertir les propriétés normales en propriétés avec notification de modification:
Le convertir en ceci:
public string Name
{
get { return _name; }
set
{
if (value == _name) return;
_name = value;
NotifyChange("Name");
}
}
Cet exemple provient de la documentation sur le [NotifyPropertyChangedInvocator]
attribut trouvé ici:
NotifyPropertyChangedInvocator
est une fonction Resharper .
Vous pouvez simplement le supprimer de votre code pour qu'il fonctionne
Une question similaire a été posée ici:
quelqu'un sait-il comment obtenir le [NotifyPropertyChangedInvocator]