c# - 绑定到 XAML 中的子 ViewModel 集合
问题描述
我有一个看起来像这样的域模型:
* Parent
* ParentProperty1
* ParentProperty2
* Children (an array of Child objects)
* Child
* ChildProperty1
* ChildProperty2
我创建了ChildUserControl
一个通过ChildViewModel
. 我的主窗口绑定到 aParentViewModel
并包含 a 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
?谢谢。
解决方案
或者我的 ParentViewModel 是否需要显式公开可绑定的 ChildViewModel 集合?
它应该。
有没有办法告诉 XAML 在绑定过程中为每个子对象创建一个视图模型?
不,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 公开适当的类型。