Cette question fait suite à celle de this older, et elle est plus une confirmation qu'une question ouverte.Ajouter une édition à MVVM dans une structure de données hiérarchique
Mon instance ViewModel possède une instance privée du modèle, _modelInst
.
ViewModel dispose d'un accès exclusif aux données du modèle lors de la modification (le modèle n'a donc pas besoin d'implémenter INotifyPropertyChanged).
Maintenant, il y a trois façons je suis venu avec la façon de modifier les données du modèle de la vue:
Obtenir/réglage directement sur l'instance du modèle
par exemple pour champs simples de valeur
return _modelInst.fieldname;
_modelInst.fieldname = value;
Celui-ci est facile à mettre en œuvre ...Création d'une instance ViewModel et opérant sur des parents la structure de données
par exemple pour types d'objets plus complexes comme struct:- Création d'une nouvelle ViewModel pour ce type.
Le ViewModel connaît le parent et son nom de champ. - afficher que dans un ContentControl + DataTemplate
- obtenir/réglage:
par les méthodes de la société mère avec le nom du champ comme paramètre,
écraser tout l'objet d'origine, même si un seul champ est modifié
Cela signifie créer une nouvelle interface (avec des routines de mise à jour fonctionnant sur
_modelInst
), implémentée par le parent, pour chacune de ces structures.- Création d'une nouvelle ViewModel pour ce type.
Création d'instances ViewModel sans connaissance directe de la structure des données du parent
par exemple pour (listes de) classes dans les classes parentCréation d'une nouvelle ViewModel pour chaque classe
Envoi des instructions de mise à jour du parent via
- commandes
- messages
- réflexion (parent sait quel enfant a appelé la fonction
en comparant l'instance à tous les enfants stockés)
Tous ces éléments sont un grand désordre mise en œuvre, la création de fonctions pour tous les domaines du modèle qui est modifiable.
Ce qui signifie à peu près tous les champs du modèle ...
(4.) On pourrait créer un ViewModel générique qui fonctionne seul par réflexion, où chaque connaît son sous-objet parent et son fieldname (+ index, si dans une liste).
Seule la logique de la racine interférerait alors avec le modèle.
Mais cette solution nécessiterait également un moyen de stocker le chemin d'accès à un champ au sein de _modelInst
.
Existe-t-il un autre moyen (plus simple) d'y parvenir?
Ai-je mal compris les principes de MVVM (encore une fois)?
MVVM est-il adapté à la manipulation de grandes structures de données hiérarchiques?
En supposant comme un objet du modèle client, créer un CustomerViewModel qui implémente des objets ICommand pour: RetrieveCustomer, createCustomer, UpdateCustomer, DeleteCustomer (chaque paramètre prenant de type client). Ensuite, votre View doit se lier à ces objets ICommand et vous envoyez un CommandParameter de type Client (probablement une liaison à partir de quelque part dans votre View). –
Ceci fonctionne bien sur une structure plate, par ex. une liste de clients.Mais que faire si j'ai une arborescence plus complexe, comme 'list contacts' où' contact' est baseclass à 'business, client, private' et' business' a une 'liste ' ...? –
Un ViewModel séparé pour chaque modèle, ouais? Pour les classes dérivées, vous pouvez essayer 'Business business = contact as Business; if (business! = null) [faire des choses liées à Business] ' –