MVVM и модели с вложенным представлением - PullRequest
24 голосов
/ 06 декабря 2010

У меня есть простой пример, где я создаю представление, состоящее из поля со списком, и в этом списке отображается множество элементов. Мне интересно, правильно ли я собираюсь создать здесь классы View Model и Model. Используйте любое значение правильно работает в этом контексте, я понимаю, что это немного субъективно, но мое текущее решение не кажется правильным. Вот упрощенная версия.

Модели и модели:

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

Вид:

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

В соответствующем коде в списке будет использоваться шаблон данных для отображения моделей дочернего представления. Но, как вы можете видеть, я не уверен, как создавать объекты, связанные с дочерними объектами. Такое ощущение, что ParentViewModel будет иметь ссылку на ParentModel и создавать объекты ChildViewModel на основе объектов ChildModel ParentModel. Теперь я сказал, что это звучит не так глупо, но мне будут интересны ваши мысли.

1 Ответ

20 голосов
/ 06 декабря 2010

Вы на правильном пути.

Родительская модель, естественно, будет содержать список дочерних моделей, например, клиент, имеющий несколько заказов.

Когда ParentViewModel создается и загружается сторонней организацией, ему передается ParentModel. Тогда ParentViewModel будет:

  1. Назначить ParentModel локальной переменной
  2. Создайте ChildViewModel для каждого ChildModel, передав ChildModel в ChildViewModel конструктор
  3. Добавить каждый из этих ChildViewModels в список

Кстати, вы хотите

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

будет

public ObservableCollection<ChildViewModel> ChildViewModels { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...