C# ICollectionView的超长刷新时间
我正在使用C# ICollectionView的超长刷新时间,c#,wpf,treeview,filtering,C#,Wpf,Treeview,Filtering,我正在使用ICollectionView在WPF中显示、过滤和排序TreeView中的项目。每个树项都有自己的子项集合,这些子项以以下方式创建: children = new ObservableCollection<MyTreeItem>(); visibleChildren = CollectionViewSource.GetDefaultView(children); 第二步是递归调用所有ICollectionViews上的Refresh,以允许它们对更改做出反应 root.
ICollectionView
在WPF
中显示、过滤和排序TreeView
中的项目。每个树项都有自己的子项集合,这些子项以以下方式创建:
children = new ObservableCollection<MyTreeItem>();
visibleChildren = CollectionViewSource.GetDefaultView(children);
第二步是递归调用所有ICollectionView
s上的Refresh
,以允许它们对更改做出反应
root.RefreshChildren();
// ->
public void RefreshChildren() {
if (ChildrenChanged)
VisibleChildren.Refresh();
foreach (var child in VisibleChildren)
(child as StructureTreeBaseItem).RefreshChildren();
}
我有点担心这种场景的性能。我在类似的条件下做了一些测试,结果表明,从头开始构建树结构大约需要100-150毫秒,应用过滤器通常不超过50毫秒,但是递归调用刷新
需要600毫秒甚至更多
从我发现的情况来看,每次应用过滤器时从头开始重建树结构似乎比使用ICollectionView
功能更有意义。这似乎是错误的。我是不是做了一些不应该做的事情,或者这是ICollectionView
的一个普遍问题,我应该用另一种方式解决这个问题
编辑:(回应评论) 这是我在XAML中的树结构的一个相关部分——没有什么特别之处:)其余部分纯粹是表示性的
<TreeView x:Name="tsdTree" DockPanel.Dock="Left" Width="250" Margin="0, 2, 0, 0" ItemsSource="{Binding Path=StructureView}" BorderThickness="0">
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding VisibleChildren}" DataType="{x:Type st:StructureTreeItem}">
(...)
</HierarchicalDataTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding VisibleChildren}" DataType="{x:Type st:StructureTreeFolder}">
(...)
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
(...)
(...)
这不是ICollectionView的一般问题,因此我想问您是否可以将您的项目上传到在线某处,以便我可以查看它。我很乐意在控件方面为您提供帮助,因为我是controls-developer:)只要以某种方式给我完整的代码,我就可以运行它,看看您的处境如何。从你上面贴的文字,我很难看出你到底在那里做什么。代码会给我们一个清晰的画面。谢谢。哈哈,但我想你可以在线上传这个项目,这样我就可以下载并运行它了:)我很抱歉,我不能透露整个代码。如果需要的话,我可以提供更多关于我的实现的信息。好的,那么让我问一些关于这方面的问题,以便更清楚地了解情况。您是否尝试过运行递归应用程序方法,然后在TreeView上调用Refresh?就一个电话?请尝试一下,并告诉我有关更改的信息。此外,您是否可以发布您的模型(表示您如何在ObservableCollection中为TreeView生成数据)以及您如何在XAML中定义TreeView。在调用我的层次结构的根项上的RecursiveApply
后,我调用RefreshChildren
,正如您在“我的代码”中所看到的那样,这会导致对项目的ICollectionView(递归)调用Refresh
。问题是,在TreeView上刷新是否会导致刷新视图。生成树结构需要很多代码,但是没有什么特别的,我只是实例化项并填充它们的子项。我将编辑我的帖子,以包括树视图的相关部分。
<TreeView x:Name="tsdTree" DockPanel.Dock="Left" Width="250" Margin="0, 2, 0, 0" ItemsSource="{Binding Path=StructureView}" BorderThickness="0">
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding VisibleChildren}" DataType="{x:Type st:StructureTreeItem}">
(...)
</HierarchicalDataTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding VisibleChildren}" DataType="{x:Type st:StructureTreeFolder}">
(...)
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>