Question MVVM et modèles de vue imbriqués


J'ai un exemple simple où je crée une vue composée d'une zone de liste et la zone de liste affiche un tas d'éléments. Je me demande si je vais procéder à la création des classes View Model et Model correctement ici. Utiliser n'importe quelle valeur de travail correct dans ce contexte, je comprends que c'est un peu subjectif, mais ma solution actuelle ne se sent pas bien. Voici une version simplifiée.

Les ViewModels et les modèles:

namespace Example
{
  public class ParentViewModel
  {
      public ParentViewModel()
      {
          // ... Create/Consume ChildViewModel * n
      }

      public List<ChildViewModel> ChildViewModels { get; set; }
  }

  public class ChildViewModel
  {
      public ChildViewModel()
      {
          // ... Create/Consume ChildModel
      }

      public ChildModel Model { get; set; }
  }

  public class ParentModel
  {
      public List<ChildModel> ChildModels { get; set; }

      public ParentModel()
      {
          // ... Create/Consume ChildModel * n;
      }
  }

  public class ChildModel
  {
      public ChildModel()
      {
          // ... Contains actual data.
      }

      public string Data { get; set; }
  }    
}

La vue:

<Window x:Class="Example.View"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Example="clr-namespace:Example" Title="View" Height="300" Width="300"
    DataContext="{StaticResource TheViewModel}">
    <Window.Resources>
    <Example:ParentViewModel x:Key="TheViewModel" />
</Window.Resources>
<Grid>
    <ListBox Height="261" HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="278" ItemsSource="{Binding ChildViewModels}"/>
</Grid>

Dans le code approprié, la listbox utilisera un modèle de données pour afficher les modèles de vue enfant. Mais comme vous pouvez le voir, je ne sais pas comment instancier les objets liés à l'enfant. Il semble que ParentViewModel aura une référence à ParentModel et créera des objets ChildViewModel basés sur les objets ChildModel du ParentModel. Maintenant, j'ai dit que ça ne sonne pas si mal, mais je serais intéressé par vos pensées.


19
2017-12-06 13:13


origine


Réponses:


Tu es sur la bonne piste.

Le modèle parent contiendrait naturellement une liste de modèles enfants, par ex. un client ayant plusieurs commandes.

Quand ParentViewModel est créé et chargé par un tiers, il est passé un ParentModel. Puis le ParentViewModel volonté:

  1. Attribuer le ParentModel à une variable locale
  2. Créer un ChildViewModel pour chaque ChildModel en passant le ChildModel au ChildViewModel constructeur
  3. Ajouter chacun de ceux ChildViewModels à une liste

Au fait, vous voulez

public List<ChildViewModel> ChildViewModels { get; set; }

être

public ObservableCollection<ChildViewModel> ChildViewModels { get; set; }

16
2017-12-06 13:24