Premier cas d’utilisation : Directement dans le ViewModel
La façon la plus simple et la plus rapide, mettre l’implémentation de l’interface INotifyPropertyChanged directement dans la classe du ViewModel, mais cette méthode devient rapidement source de répétition et de duplication du code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class MonViewModel : INotifyPropertyChanged { private bool _maValeur; public bool MaValeur { get { return _maValeur; } set { _maValeur= value; OnPropertyChanged("MaValeur"); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } |
Avantages / Inconvénients
+ Le plus simple
– Répétitif si on a beaucoup de ViewModel
– Duplication du code de l’implémentation
– Non maintenable
– On est obligé de mettre une chaîne de caractères pour nommer la propriété dans la méthode OnPropertyChanged()
Second cas d’utilisation : Dans une classe séparée dont le ViewModel va hériter
Ici l’implémentation est dans une classe à part et permet d’aller plus vite lors de la création d’un nouveau ViewModel. C’est aussi bien plus maintenable car si l’on souhaite améliorer le code de l’implémentation, on ne l’a modifie qu’à un seul endroit dans l’application.
1 2 3 4 5 6 7 8 9 10 |
public class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } |
Nous n’avons plus qu’à faire hériter notre ViewModel.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class MonViewModel : ViewModelBase { private bool _maValeur; public bool MaValeur { get { return _maValeur; } set { _maValeur= value; OnPropertyChanged("MaValeur"); } } } |
Avantages / Inconvénients
+ Simple à mettre en place
+ Implémentation non dumpliquée
+ Maintenable
– Cela pose problème si le ViewModel hérite d’une autre classe
– On est obligé de mettre une chaîne de caractères pour nommer la propriété dans la méthode OnPropertyChanged()
Amélioration de l’implémentation de l’interface INotifyPropertyChanged
Voici un exemple d’amélioration de l’implémentation de l’interface (qui n’a plus qu’à se faire dans une seule classe !), Il y a un point négatif commun entre les deux cas, la chaîne de caractères pour nommer la propriété dans la méthode OnPropertyChanged().
Il existe un attribut appelé CallerMemberName en C# qui permet de récupérer la chaîne de caractère de la propriété ou méthode qui l’appelle.
Pour l’occasion j’ai renommé la classe ViewModelBase en ViewModelNotify et la méthode s’appelle NotifyPropertyChanged() au lieu de OnPropertyChanged() (c’est l’implémentation que j’utilise dans mes projets).
1 2 3 4 5 6 7 8 9 10 11 12 |
public class ViewModelNotify : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged([CallerMemberName] string str = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(str)); } } } |
Comme l’attribut s’occupe de récupérer le nom de la propriété, nous n’avons plus besoin de la spécifier (on peut toute de même le faire au cas où).
1 2 3 4 5 6 7 8 9 10 |
private bool _maValeur; public bool MaValeur { get { return _maValeur; } set { _maValeur= value; NotifyPropertyChanged(); } } |
J’espère que ce petit tutoriel vous sera utile, et n’hésitez pas à laisser un commentaire si j’ai fais une erreur ou un oublis.
Have fun !