首页 > 解决方案 > 绑定到 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?谢谢。

标签: c#wpfxamlmvvmdata-binding

解决方案


或者我的 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 公开适当的类型。


推荐阅读