web-dev-qa-db-fra.com

Qu'est-ce que [NotifyPropertyChangedInvocator] en C # lorsque implémente INotifyPropertyChanged?

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.

37
Waqas Idrees

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: enter image description here
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:
enter image description here

70
Jens Kloster

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]

2
Sajeetharan - MSFT