[WPF/Silverlight] Implémenter le pattern MVVM (Model-View-ViewModel)
Introduction
Depuis toujours nous utilisons des patterns tels que MVC ou MVP. Cependant avec la puissance du binding de WPF/Silverlight est apparu un nouveau pattern nommé MVVM.
A l’époque, nous aurions fait comme ceci (avec une couche metier en + la plupart du temps):
Nous allons utiliser le binding afin d’avoir ceci:
Le Model ou Data Model: C’est ce qui contiendra vos données, par exemple Linq-To-Sql ou Entities. Vous pouvez aussi avoir vos propres providers de données. Attention cependant, les classes doivent implémenter INotifyPropertyChanged (à implémenter dans les classes partielles générées par Linq par exemple).
Le ViewModel: C’est ce qui contiendra la logique de votre application. Il fera le lien entre les vues et le modèle. Le ViewModel type les données du modèle en INotifyCollectionChanged et définit tous les événements de votre IHM grâce à des “commands” (par exemple clic sur un bouton).
Les Views: Les vues sont les IHMs de notre application. Le seul code behind qu’elles peuvent avoir est l’attribuation du DataContext sur le ViewModel.
Quels sont les avantages ?
Le modèle (ou Data Model) ne stocke que des données à un état “final” et l’ihm ne possède pas de code behind (ou très peu) ce qui améliore la maintenance et les tests unitaires.
Comment l’implémenter en WPF ?
Vous pouvez télécharger un exemple que j’ai fait en cliquant ici.
Voici l’architecture de notre solution:
Model possède nos données, c’est à dire une classe Product représentant un Produit et implémentant INotifyPropertyChanged ainsi qu’une classe GetTestProducts me retournant une liste de produit fictifs:
ViewModel va nous permettre de récupérer les données pour les “binder” plus tard dans la vue. ViewModel possèdera aussi un attribut de type ICommand qui nous permettra de rattacher la logique d’un bouton de l’IHM:
Pour finir, la vue en XAML qui possède une liste qui se bind sur Products ainsi qu’un bouton qui déclenche la méthode MethodTest(), sans oublier l’affectation du ViewModel dans le DataContext:
Comment l’implémenter en Silverlight ?
Vous pouvez télécharger un exemple que j’ai fait en cliquant ici.
Pour l’implémenter en Silverlight c’est sensiblement la même chose, excepté que pour attacher une ICommand à un bouton il faut réaliser quelques modifications.
Sources qui m’ont aidé pour cette article:
Article sur les ICommand en silverlight
Article sur MVVM