26/07/2013

[XAML] INotifyPropertyChanged

Bonjour à toutes et à tous,
aujourd'hui je vais vous présenter l'interface INotifyPropertyChanged. Donc pour celles et ceux qui ne la connaîtrait pas c'est par ici.

Ca sert à quoi ?

Très utilisée dans les technologies XAML (Windows Phone, Silverlight, WPF), cette interface va nous permettre de signaler qu'une propriété d'un objet a été modifiée par le biais d'un événement et cela va permettre de notifier à votre View(MVVM) ce changement et permettre le rafraîchissement d'informations dans le cadre de Binding.
Du coup c'est plutôt utile. ^^

Comment on fait ?

Premièrement en l'implémentant l'interface.

public class User : System.ComponentModel.INotifyPropertyChanged
{

}
Puis vous faites un clic droit sur INotifyPropertyChanged et "Implémenter l'interface". Vous allez récupérer l'évént handler automatiquement dans votre classe :

public event PropertyChangedEventHandler PropertyChanged;

Et c'est tout ce que vous allez récupérer ! Libre à vous de composer la méthode qui va lever l'événement !

Les accesseurs

Pour petit rappel, pour coder nos accesseurs avant C# 3 :

private string _name;
public string Name
{
   get
   {
      return _name;
   }
   set
   {
      _name = value;
   }
}

Pour coder nos accesseurs après C# 3 :

public string Name { get; set; }

Nos accesseurs avec INotifyPropertyChanged :

private string _name;
public string Name
{
   get
   {
      return _name;
   }
   set
   {
      if(_name != value)
      {
         _name = value;
         // Ici on notifie
      }
   }
}

Pourquoi vérifier si la valeur est changé, simplement dans un souci de performances. "Trop de notifications, tue la notification". De plus et toujours pour les mêmes raisons, ne coder vos accesseurs de cette manière que si les propriétés ont besoins de signaler qu'elles ont été modifiées.

Méthodes de notification

Bon pour les méthodes je vous en propose aujourd'hui 2.
La première est celle proposée dans la MSDN :

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

private string _name;
public string Name
{
   get
   {
      return _name;
   }
   set
   {
      if(_name != value)
      {
         _name = value;
         NotifyPropertyChanged();
      }
   }
}

La seconde est celle que j'ai trouvé dans le livre écrit par Jonathan ANTOINE et Thomas LEBRUN intitulé "MVVM - De la découverte à la maîtrise" que vous pouvez retrouver ici


protected void RaisePropertyChanged<T>(Expression<Func<T>> exp)
{
   var memberExpression = exp.Body as MemberExpression;

   if (memberExpression != null)
   {
      string propertyName = memberExpression.Member.Name;
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null)
      {
         handler(this, new PropertyChangedEventArgs(propertyName));
      }
   }
}

private string _name;
public string Name
{
   get
   {
      return _name;
   }
   set
   {
      if(_name != value)
      {
         _name = value;
         RaisePropertyChanged<string>(() => Name);
      }
   }
}

C'est par exemple cette deuxième implémentation que j'ai utilisé pour mon application "Gâteaux de Laetitia".

Conclusion

Pour plus d'information sur l'interface, c'est par ici
Les deux méthodes présentées ici, ont le mérite de pouvoir continuer à fonctionner même si vous renommez vos variables. Voilà c'est tout pour aujourd'hui.
A bientôt

Aucun commentaire:

Enregistrer un commentaire