绑定到XAML中的子ViewModel的集合

时间:2018-08-26 21:28:34

标签: c# wpf xaml mvvm data-binding

我有一个如下所示的域模型:

* Parent
  * ParentProperty1
  * ParentProperty2
  * Children (an array of Child objects)
* Child
  * ChildProperty1
  * ChildProperty2

我创建了一个自定义ChildUserControl,它通过ChildViewModel绑定到孩子。我的主窗口绑定到ParentViewModel并包含一个WrapPanel,该ChildUserControl为该父母拥有的每个孩子显示一个 <ItemsControl ItemsSource="{Binding Children}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <WrapPanel /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <editor:ChildUserControl DataContext="{Binding}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>

该面板的XAML是:

DataContext

此问题是,它会将每个ChildUserControl的{​​{1}}设置为原始Child对象,而不是先将它们包装在ChildViewModels中。有什么方法可以告诉XAML在绑定过程中为每个子对象创建一个视图模型?还是我的ParentViewModel需要显式公开ChildViewModels的可绑定集合?谢谢。

1 个答案:

答案 0 :(得分:1)

  

还是我的ParentViewModel需要显式公开可绑定的ChildViewModels集合?

应该。

  

在绑定过程中是否可以通过某种方式告诉XAML为每个子对象创建一个视图模型?

否,XAML处理器无法为包装实际子元素的每个子对象创建视图模型。 XAML是一种标记语言。

您可能会使用绑定到子对象并返回子视图模型对象的value converter

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <DataTemplate.Resources>
            <local:ModelToViewModelConverter x:Key="converter" />
        </DataTemplate.Resources>
        <editor:ChildUserControl DataContext="{Binding Path=, Converter={StaticResource converter}}" />
    </DataTemplate>
</ItemsControl.ItemTemplate>

但是我当然希望从ParentViewModel中公开适当的类型。