MVVM et Silverlight (quelques doutes sur mon approche MVVM)
Bonjour,
Voilà quelques temps que je travail sur un projet Silverlight de relativement grande envergure. J’ai décidé d’utiliser le pattern MVVM sur le projet et ça se passe relativement bien, on se rend compte de la réelle puissance des Bindings, etc...
La où ça coince, c’est plus au niveau de l’architecture même de l’application. Prenons un exemple simple, j’ai un écran avec sur la gauche une liste de personnes, et sur la droite un formulaire permettant d’éditer les informations de la personne sélectionné dans la liste. Les modifications de ce formulaire ne sont pas effectives de suite, elles le sont lorsqu’on presse le bouton « sauvegarder » au bas du formulaire.
Comment ça se passe dans l’ombre ? J’ai donc deux vues, la liste (DataGrid) et le formulaire (des TextBox, des ComboBox...), le ViewModel de la liste possède une liste de PersonViewModel, cette liste est l’ItemsSource du DataGrid, et les propriétés des PersonViewModel sont bindées aux colonnes du DataGrid. Le ViewModel du formulaire possède quant à lui un PersonViewModel correspondant à l’item sélectionné dans la liste.
J’ai donc deux instances de PersonViewModel représentant un même objet PersonModel. Sachant, que les ViewModel connaissent leur Model mais pas l’inverse, ça me paraît être le plus naturel.
Ainsi, lorsqu’on modifie les valeurs du formulaire, les changements sont effectifs dans une instance de PersonViewModel.
La où je perds un peu le fil, c’est quand on clic sur le bouton « enregistrer », que doit-il se passer en théorie ? A l’heure actuelle, je récupère les nouvelles valeurs dans le PersonViewModel du formulaire avec le PersonModel correspondant, puis je passe le tout à mon service chargé d’enregistrer l’objet. C’est à ce moment là que ça devient compliqué, je vois plusieurs démarches :
1 – Je modifie le PersonModel avec les nouvelles valeurs, (les changements sont répercutés dans tous les VM correspondant par les INotifyPropertyChangedEvent). Puis j’enregistre cet objet en base. Là où ça coince, c’est si il y a une erreur à l’enregistrement en base, j’ai déjà modifié mon Model, et donc indirectement ce qui est affiché.
2 – Je modifie le PersonModel avec les nouvelles valeurs, (pas d’INotifyPropertyChangedEvent), j’enregistre l’objet en base, puis je crée de nouvelles instances de PersonViewModel à partir du PersonModel fraîchement enregistré.
Bien que je connaisse WPF depuis quelques temps maintenant, le pattern MVVM est tout nouveau pour moi et il est possible qu’une grosse erreur ce soit introduite dans ma façon d’appliquer ce pattern. Ainsi, si vous sentez en me lisant que je ne fais pas ce qu’il faut, ce serait très gentil de me le signaler pour que je change mon approche.
Merci d’avoir eu le courage de tout lire, et je serait ravis de répondre à toute question qui pourrait permettre à des personnes plus expérimentées de comprendre mon architecture et pourquoi pas de m’aider à la corriger.