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.
+1 para el ObservableCollection. –
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
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