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>