J'ai besoin d'aide pour créer des modèles de vue pour le scénario suivant:
- Des données profondes et hiérarchisées
- Vues multiples pour le même ensemble de données
- Chaque vue est une vue unique, à changement dynamique, basée sur la sélection active
- Selon la valeur d'une propriété, affichez différents types d'onglets dans un contrôle d'onglet
Mes questions:
Dois-je créer une représentation de modèle de vue pour chaque vue (VM1, VM2, etc.)?
1. Yes:
a. Should I model the entire hierarchical relationship? (ie, SubVM1, HouseVM1, RoomVM1)
b. How do I keep all hierarchies in sync? (e.g, adding/removing nodes)
2. No:
a. Do I use a huge, single view model that caters for all views?
Voici un exemple d'une vue unique
Figure 1: plusieurs vues mises à jour en fonction de la pièce active. Contrôle de l'onglet Avis
Figure 2: Différente salle active. Plusieurs vues mises à jour. Les éléments de contrôle d'onglets ont été modifiés en fonction de la propriété de l'objet.
Figure 3: type de sélection différent. Modifications de la vue entière
Réponses:
Pour répondre à la question, Oui, chaque vue doit avoir son propre modèle de vue. Mais il n'est pas nécessaire de modéliser toute la hiérarchie. Seulement ce dont la vue a besoin.
Le problème que j'ai eu avec la plupart des ressources en ligne concernant MVVM:
Dans la plupart des exemples, la vue est une cartographie presque 1: 1 du modèle. Mais dans mon scénario, où il existe différentes vues pour différentes facettes du même modèle, je me retrouve coincé entre deux choix:
Un modèle de vue monolithique utilisé par tous les autres modèles de vue
Ou un modèle de vue pour chaque vue
Mais les deux ne sont pas idéaux.
Le modèle de vue orienté modèle (MVM), bien que faible en duplication de code, est un cauchemar à maintenir
Le modèle de vue orienté vue (VVM) produit des classes hautement spécialisées pour chaque vue, mais contient des doublons.
En fin de compte, j'ai décidé qu'il était plus facile de maintenir et de coder une machine virtuelle par vue, j'ai donc opté pour l'approche VVM.
Une fois que le code fonctionne, j'ai commencé à refactoriser toutes les propriétés et opérations courantes dans leur forme finale actuelle:
Dans cette forme finale, la classe de modèle de vue commune est composée dans chaque VVM.
Bien sûr, je dois encore décider ce qui est considéré comme commun / spécialisé. Et lorsqu'une vue est ajoutée / fusionnée / supprimée, cet équilibre change.
Mais la bonne chose à ce sujet est que je suis maintenant capable de pousser les membres haut / bas du commun vers VVM et vice versa facilement.
Et une note rapide concernant la synchronisation des objets:
Avoir un modèle de vue commune s'occupe de la plupart de cela. Chaque VVM peut simplement avoir une référence au même modèle Common View.
J'ai également tendance à commencer par des méthodes de rappel simples et à évoluer vers un événement / observateur si le besoin de plusieurs auditeurs se fait sentir.
Et pour les événements vraiment complexes (c'est-à-dire les mises à jour en cascade inattendues), je passerais à l'utilisation d'un médiateur.
Je n'ai pas peur du code où un enfant a une référence arrière à son parent. Tout pour faire fonctionner le code.
Et si l'occasion de refactoriser se présentait, je la saisirais.
Les leçons que j'ai apprises:
la source
En regardant vos maquettes, je recommanderais certainement de créer une hiérarchie de ViewModels et de nombreuses petites vues. Et vous devrez probablement modéliser un peu la hiérarchie d'origine.
Pour synchroniser les choses entre les ViewModels, utilisez des événements ou ayez des propriétés entre les ViewModels. La synchronisation entre les vues et les ViewModels doit être une propriété de notification standard.
la source