2010-12-06 11 views
18

Tengo un ejemplo simple en el que estoy creando una vista que consiste en un cuadro de lista, y el cuadro de lista muestra un grupo de elementos. Me pregunto si estoy haciendo la creación de las clases View Model y Model correctamente aquí. Usar cualquier valor de trabajo correcto en este contexto, entiendo que es un poco subjetivo, pero mi solución actual no se siente bien. Aquí hay una versión simplificada.MVVM y modelos de vista anidados

Los ViewModels y modelos:

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 Vista:

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

En el código correcto, el cuadro de lista utilizarán una plantilla de datos para mostrar los modelos de vista del niño. Pero como pueden ver, no estoy seguro de cómo instanciar los objetos relacionados con el niño. Parece que ParentViewModel tendrá una referencia al ParentModel y creará objetos ChildViewModel basados ​​en los objetos ChildModel de ParentModel. Ahora he dicho que no suena tan tonto, pero me interesarían tus pensamientos.

Respuesta

15

Estás en el camino correcto.

El modelo principal contiene naturalmente una lista de modelos secundarios, p. un cliente que tiene pedidos múltiples

Cuando ParentViewModel es creado y cargado por un tercero, se pasa a ParentModel. A continuación, el ParentViewModel serán:

  1. Asignar la ParentModel a una variable local
  2. Crear una ChildViewModel para cada ChildModel pasando el ChildModel a la ChildViewModel constructor
  3. añade dichos ChildViewModels a una lista

Por cierto, usted quiere

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

para ser

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

+1 para el ObservableCollection. –

+0

Eso es interesante, no pensé que el Modelo tuviera una referencia al ViewModel, o realmente lo conociera. Supuse que la Vista tenía una referencia al ViewModel, y ViewModel tenía una referencia al Modelo. Esto podría ser confundir MVC, MVP, MP, MVVM y la miríada de otras variaciones, aunque :) – Ian

+8

Lo sentimos, ¡NO! el modelo nunca contiene una referencia a ViewModel, siempre al revés. Básicamente ViewModel sabe sobre Model y no tiene conocimiento de View. La vista no conoce el modelo de vista ni el modelo, solo vincula con los nombres de propiedad. – Aliostad

Cuestiones relacionadas