在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中拥有另一个数据绑定控件?如果可以,如何?
缺少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>