在WPF树视图中嵌套数据绑定控件

本文关键字:嵌套 数据绑定 控件 视图 WPF | 更新日期: 2023-09-27 18:24:39

试图构建一个WPF TreeView控件,该控件内部可以包含另一个数据绑定控件

<TreeView temsSource="{Binding DocumentCategories}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding DocumentCategory1}">
            <TextBlock FontWeight="Bold" Text="{Binding Description}"></TextBlock>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <ListView ItemsSource="{Binding Documents}">
                        <TextBlock FontWeight="Bold" Text="{Binding Name}"></TextBlock>
                    </ListView>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

DocumentCategories数据是递归的-列表中的每个项都有一个DocumentCategories的DocumentCategory1集合,该集合有自己的DocumentCategory1集合,依此类推。

如果里面没有ListView,这就可以正常工作。然而,当您添加ListView时,TreeView会正常显示,但当您尝试打开其中一个节点时,应用程序会崩溃,并出现错误:

ItemsSource正在使用时操作无效。访问和修改具有ItemsControl.ItemsSource而不是的元素

我不完全确定这是指哪个ItemsSource——TreeView还是ListView。我认为是后者,问题是由绑定直到节点打开后才真正发生这一事实引起的。

我已经尝试将DocumentCategories和Documents从List更改为ObservableCollection,这似乎是解决此错误的常见方法,但它的行为仍然相同。

是否可以在TreeView中拥有另一个数据绑定控件?如果可以,如何?

在WPF树视图中嵌套数据绑定控件

缺少ListView的DataTemplate。

目前,以下元素被解释为实际的ListView元素:

<TextBlock FontWeight="Bold" Text="{Binding Name}"></TextBlock>

由于您已经绑定了ListView的ItemSource,当视图试图将"TextBlock"添加为ListView的项时,会发生错误。

只需将其更改为以下内容:

<ListView ItemsSource="{Binding Documents}">
  <ListView.ItemTemplate>
    <DataTemplate>
      <TextBlock FontWeight="Bold" Text="{Binding Name}"></TextBlock>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>