Я имею дело с этим, не поступая так, как вы описываете.
Если мне нужно представить объект Foo
и связанные с ним объекты Bar
в представлении, FooViewModel
обычно реализует свойство Bars
типа ObservableCollection<BarViewModel>
.
Обратите внимание, что это независимо от того, имеет ли базовый класс Foo
свойство Bars
типа IEnumerable<Bar>
. Класс Foo
может и не быть. Приложению может даже не потребоваться иметь возможность перебирать все объекты Bar
для Foo
, за исключением пользовательского интерфейса.
Редактировать
Когда мое представление представляет собой простое представление объектной модели приложения, я в значительной степени поступаю так же, как вы в своем примере. Код в моем конструкторе, как правило, немного более компактен:
_Bars = new ObservableCollection<BarViewModel>(
_Foo.Bars.Select(x => new BarViewModel(x)));
но по сути это одно и то же.
Но это предполагает, что Foo
действительно выставляет свойство Bars
. Возможно, нет. Или, может быть, только несколько Bar
объектов должны появиться в представлении. Или, может быть, они должны выглядеть смешанными с другими объектами, а FooViewModel
должен отображать CompositeCollection
некоторого вида.
Я хочу сказать, что модель вида - это модель вида 1035 *. Это не обязательно имеет прямое соответствие с базовой объектной моделью.
Чтобы выбрать простой пример: моя программа может дать пользователю возможность поместить элементы в пять различных категорий, перетаскивая их в пять различных элементов управления ListBox
. В конечном счете, выполнение этого устанавливает свойство Category
объекта Item
. Моя модель представления будет иметь коллекцию CategoryViewModel
объектов, каждый со свойством типа ObservableCollection<ItemViewModel>
, так что перетаскивание элементов назад и вперед между коллекциями будет простым в реализации.
Дело в том, что в объектной модели приложения может даже не быть класс a Category
, не говоря уже о коллекции Category
объектов. Item.Category
может быть просто свойством типа string
. CategoryViewModel
не отражает объектную модель приложения. Он существует только для поддержки представления в пользовательском интерфейсе.