Pourquoi nous optons pour MVVM sur MVC ou MVP tout en traitant avec WPF?
Quel avantage supplémentaire nous obtenons en l'utilisant?
Éditer:
Pour être honnête, j'ai eu aujourd'hui une interview et on m'a posé cette question. J'ai répondu comme INotifyPropertyChanged, ICommand, IValue Convertor .. mais il n'était pas satisfait. Désormais j'ai posé cette question
Merci d'avance
Je vais vous signaler un video particulièrement utile de Jason Dolinger.
Venant d'un monde WinForms, la mise en œuvre de n'importe quel modèle de style MVX semblait plus compliquée qu'elle n'en valait la peine, mais après avoir travaillé avec WPF pendant quelques années maintenant, je peux honnêtement dire que je n'envisagerais rien de moins. L'ensemble du paradigme est pris en charge dès le départ.
Tout d'abord, le principal avantage est de permettre une véritable séparation entre view
et model
. En termes réels, cela signifie que si/quand votre modèle doit changer, il peut le faire sans que la vue en ait besoin et vice-versa.
Deuxièmement, bien que votre model
puisse contenir toutes les données dont vous pourriez avoir besoin dans votre view
, vous souhaiterez peut-être résumer ces données de telle manière que votre model
ne prend pas en charge . Par exemple, supposons que votre modèle contienne une propriété date. Dans le modèle, il peut exister uniquement en tant qu'objet DateTime
mais votre vue peut vouloir le présenter d'une manière complètement différente. Sans le viewmodel
, vous devrez soit dupliquer la propriété dans le model
pour prendre en charge la vue, soit modifier la propriété qui pourrait sérieusement obscurcir le "modèle".
Vous pouvez également utiliser un viewmodel
pour agréger des parties de votre modèle qui existent dans des classes/bibliothèques distinctes afin de faciliter une interface plus fluide pour le view
. Il est très peu probable que vous souhaitiez travailler avec les données de votre code de la même manière qu'un utilisateur voudra ou voudra que les données soient présentées à leur.
En plus de cela, vous obtenez la prise en charge de la liaison de données bidirectionnelle automatique entre view
et viewmodel
.
Il y a vraiment tout un tas de trucs supplémentaires sur lesquels je pourrais m'adresser mais Jason le dit bien mieux que je pourrais donc mon conseil est de regarder la vidéo. Après quelques jours de travail comme celui-ci, vous vous demanderez comment vous avez pu vous en passer.
Bonne chance.
Ce sont les miens spécifiques à MVVM
Les deux autres schémas sont en quelque sorte séparés en termes de préoccupations qu'ils abordent. Vous pouvez utiliser MVVM avec MVP et MVC (la plupart des bons échantillons existent en quelque sorte).
En fait, MVP (avec une vue passive, plutôt qu'un contrôleur de supervision) n'est vraiment qu'une variante de MVVM, à mon avis.
WPF a une meilleure liaison de données que tout autre cadre d'interface utilisateur, dont MVVM serait indiscipliné sans
MVVM offre une testabilité unitaire et un excellent agnostic de vue, ce qui en fait une bonne chose à utiliser
La prise en charge de ICommand et INotifyPropertyChanged sont les deux principaux avantages. L'utilisation de MVVM facilite le câblage des commandes et la connexion des données à l'interface utilisateur WPF. Les choses fonctionnent.
Personnellement, je considère MVVM non pas comme un avantage, mais comme une obligation pour ceux qui souhaitent utiliser les fonctionnalités intéressantes de WPF.
WPF est très très fortement construit avec la liaison de données au cœur, pour permettre la séparation de l'interface utilisateur du modèle. Mais la façon dont la liaison de données est techniquement effectuée dans WPF est quelque peu spéciale, car elle est liée à des classes comme:
Pour cette raison, vous ne pouvez pas vraiment écrire un modèle comme vous le souhaitez en utilisant la technologie .NET standard. Par exemple, WPF TreeView est presque impossible à utiliser sans utiliser de liaison de données et de modèles. Vous ne pouvez simplement pas le remplir comme vous le feriez à partir d'un modèle générique dans Winforms par exemple. Il doit être lié à un modèle hiérarchique utilisant ObservableCollection pour représenter les enfants d'un nœud.
Supposons donc que V représente le code XAML et son homologue codé (donc il est lié à WPF en tant que technologie), et disons que M représente votre modèle (il n'est donc pas lié à la technologie WPF UI de toute façon).
Eh bien, cela ne fonctionnera jamais correctement sous WPF avec seulement ces V & M.
Vous devez ajouter quelque chose entre les deux. Quelque chose qui est compatible WPF et qui comprend votre modèle. Quelque chose qui parle DependencyProperty, ObservableCollection et INotifyPropertyChanged. C'est ce qu'on appelle VM.
En guise de remarque, une alternative à MVVM consiste à créer une combinaison V & M (w/o VM plumbing) avec M compatible WPF mais toujours avec une indépendance d'interface utilisateur raisonnable. Historiquement, ObservableCollection se trouvait dans l'assembly WindowsBase.dll (fourni avec WPF), il était donc vraiment étrange de lier un modèle générique à quelque chose lié à une technologie d'interface utilisateur. Il a été replacé dans System.dll depuis. Même dans ce cas, il est parfois difficile garder un pur VM sans peaufiner le M spécifiquement pour WPF ...
La capacité du code XAML à se lier à des données, ainsi que l'existence de déclencheurs briseront les modèles MVP et MVC.