Qu'est-ce que [NotifyPropertyChangedInvocator]en C# lorsque les instruments INotifyPropertyChanged?

je vois deux types de mise en œuvre 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));
            }
        }
    }
    
  • La seconde:

    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 2e, vous voyez qu'il y a un attribut supplémentaire [NotifyPropertyChangedInvocator] la méthode OnPropertyChanged

Dans mon cas, les deux se comporte de la même chose mais quoi, pourquoi et quand utiliser cette [NotifyPropertyChangedInvocator], quels sont les avantages? J'ai cherché sur internet mais je n'ai pas trouvé de bonne réponse.

33
demandé sur Jason Evans 2014-04-22 11:24:06

2 réponses

c'est un attribut Resharper de leur Annotations - conçus pour vous donner un avertissement, puis votre code suspect :)

Considérez 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
           } 
     }
   }

[NotifyPropertyChangedInvocator] attribut sur l' NotifyChanged méthode Resharper vous donnera un avertissement, que vous invoquez la méthode avec une (probablement) Mauvaise Valeur.



Parce que Resharper sait maintenant!--18--> méthode doit être appelée à changer notification, il vous aidera à convertir des propriétés normales en propriétés avec notification de changement: enter image description here

Convertir en ceci:

public string Name
{
  get { return _name; }
  set
  {
    if (value == _name) return;
    _name = value;
    NotifyChange("Name");
  }
}





Cet exemple est tiré de la documentation sur le [NotifyPropertyChangedInvocator] l'attribut trouvé ici:

enter image description here

61
répondu Jens Kloster 2015-01-05 07:48:54

NotifyPropertyChangedInvocator est un Resharper fonctionnalité.

Vous pouvez simplement le supprimer à partir de votre code pour qu'il fonctionne

question similaire a été posée ici:

quelqu'un sait-il comment faire pour obtenir l' [NotifyPropertyChangedInvocator]

3
répondu Sajeetharan 2014-04-22 09:23:50