2010-07-29 4 views
5

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:

  1. 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 ...

  2. 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.

  3. 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 parent

    • Création d'une nouvelle ViewModel pour chaque classe

    • Envoi des instructions de mise à jour du parent via

      1. commandes
      2. messages
      3. 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?

+0

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). –

+0

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 ' ...? –

+0

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] ' –

Répondre

0

Ceci est une excellente question ce que je ne pense pas qu'il y ait une bonne réponse qui vient en stock avec le modèle MVC. ViewModels fonctionne très bien lorsque le modèle auquel ils correspondent n'a pas d'enfants.

Mais quand le modèle a des enfants, comme dans

client

 -->Order 

     -->Country 

(Pays imaginer étaient un objet enfant du client) le modèle de conception de type de tombe en panne. La meilleure chose que j'ai trouvée est d'utiliser l'héritage et d'exposer sélectivement uniquement aux enfants pour lesquels vous avez besoin de la logique viewmodel. Sinon, il suffit d'accéder aux propriétés du modèle de la vue qui viendra par héritage, à savoir .

public class CustomerView: Client // hérite du client (modèle) {

public CustomerView(Customer customer) 
{ 
     this.FirstName = customer.FirstName 
     //etc.. 

     //Only if you need it, that is if you have some display-specific 
     //logic relating to country for a given view, you create 
     //a CountryView class that inherits from Country and gets populated 
     //by an instance of it as well 
     this.CountryView = new CountryView(customer.Country) 
} 

public CountryView CountryView {get;set;} //sadly you cannot override Country but you may be able to shadow it. 

public string DisplayColor 
{ 
    if(base.FirstName == "Joe") 
    { 
     return "red"; 
    } 
    return ""; 
} 

}

Cela devient confus quand traiter avec petits-enfants. Si quelqu'un a une meilleure solution, j'aimerais l'entendre.

Merci

Questions connexes