У меня есть модель предметной области, которая выглядит так:
* Parent
* ParentProperty1
* ParentProperty2
* Children (an array of Child objects)
* Child
* ChildProperty1
* ChildProperty2
Я создал собственный ChildUserControl, который привязывается к ребенку через ChildViewModel. Мое главное окно привязано к ParentViewModel и содержит WrapPanel, который отображает по одному ChildUserControl для каждого дочернего элемента, принадлежащего этому родителю.
XAML для панели:
<ItemsControl ItemsSource = "{Binding Children}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<editor:ChildUserControl DataContext = "{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Проблема в том, что он устанавливает DataContext каждого ChildUserControl как необработанный объект Child, а не сначала оборачивает их в ChildViewModels. Есть ли способ указать XAML создать модель представления для каждого дочернего объекта во время процесса привязки? Или моему ParentViewModel нужно явно выставлять привязываемую коллекцию ChildViewModels? Спасибо.
@Stefan В настоящее время Children представляет собой набор объектов Child, а не объектов ChildViewModel. Кажется странным иметь модель представления, содержащую дочерние модели представления, но, может быть, это лучший способ?





Or does my ParentViewModel need to explicitly expose a bindable collection of ChildViewModels?
Должно.
Is there some way to tell XAML to create a view-model for each child object during the binding process?
Нет, процессор XAML не может создать модель представления для каждого дочернего элемента, которая обертывает фактический дочерний элемент. XAML - это язык разметка.
Вы могли бы использовать преобразователь значений, который привязывается к дочернему объекту и возвращает объект модели дочернего представления:
<ItemsControl.ItemTemplate>
<DataTemplate>
<DataTemplate.Resources>
<local:ModelToViewModelConverter x:Key = "converter" />
</DataTemplate.Resources>
<editor:ChildUserControl DataContext = "{Binding Path=, Converter = {StaticResource converter}}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
Но я определенно предпочел бы предоставлять соответствующие типы из ParentViewModel.
Or does my ParentViewModel need to explicitly expose a bindable collection of ChildViewModels: это более распространенный способ, но IMO вы уже делаете это при привязке кChildren