Je suis actuellement confronté à l'un des problèmes les plus discutés dans MVVM: j'ai un modèle complexe dans mon application WPF et je ne sais pas comment afficher ses données dans la vue.

Selon de nombreuses réponses ici sur StackOverflow et aussi à cet article il y a deux façons:

  1. pour envelopper le modèle dans le ViewModel en ajoutant une propriété dans le ViewModel pour chaque propriété dans le modèle

  2. pour exposer le modèle directement à la vue sans répliquer les propriétés.

Ce que j'ai compris jusqu'à présent, c'est que la première approche est meilleure d'un point de vue théorique, tandis que la seconde est un raccourci rapide à éviter.

Dans le même article J'ai précédemment lié, l'auteur écrit ce qui suit:

En examinant l'exemple d'application du framework Caliburn, ils implémentent la VM à l'aide de l'option 2.

J'ai jeté un coup d'œil à la documentation Caliburn.Micro et malheureusement elle utilise juste un simple ViewModel sans vrai modèle, donc je ne sais pas comment vérifier cette déclaration.

L'auteur a-t-il raison? Puisque j'utilise Caliburn.Micro, dois-je utiliser la deuxième approche au lieu de la première afin d'être plus «conforme» à l'implémentation du framework?

2
Brutus 16 janv. 2017 à 14:23

2 réponses

Meilleure réponse

Puisque j'utilise Caliburn.Micro, dois-je utiliser la deuxième approche au lieu de la première afin d'être plus «conforme» à l'implémentation du framework?

Non. Caliburn.Micro n'est qu'une bibliothèque MVVM. La manière de mettre en œuvre le modèle MVVM actuel dépend entièrement de vous.

Je suis d'accord avec @Marek Dzikiewicz que vous devez envelopper le modèle dans une classe de modèle de vue qui peut implémenter l'interface INotifyPropertyChanged et fournir toute autre fonctionnalité spécifique à l'interface utilisateur. Ce code n'appartient à aucun objet métier. Vous pouvez vous référer à ma réponse ici pour plus d'informations:

Réutiliser les mêmes modèles dans ASP.NET MVC et WPF MVVM

Évidemment, si la classe de modèle est effectivement une classe spécifique à l'interface utilisateur qui n'est utilisée dans aucune autre application et ne contient aucune logique métier utilisée côté serveur, vous pouvez modifier cette classe et vous y lier directement. Mais alors c'est une sorte de modèle de (sous) vue après tout.

4
Community 23 mai 2017 à 10:30

En général, il est préférable d'exposer les modèles de vue, car cela vous permet d'ajouter des propriétés supplémentaires pour contrôler la façon dont les données sont affichées (par exemple, le formatage ou la concaténation des données). Cependant, si vous n'en avez pas besoin, il n'y a rien de mal à exposer directement les classes de modèle.

3
Marek Dzikiewicz 16 janv. 2017 à 11:29