C# ListView正在创建新控件,而不是刷新

C# ListView正在创建新控件,而不是刷新,c#,.net,wpf,xaml,listview,C#,.net,Wpf,Xaml,Listview,我有一个控件,它使用ParentObject作为其数据上下文。ParentObject有一个名为ChildObject的属性,该属性可能会更改。执行此操作时,ParentObject引发PropertyChanged事件 控件使用XAML为ChildObject的List属性中的项定义ListView。当ParentObject中的ChildObject属性更改时,将重新创建整个视图,这意味着将实例化新控件 ListView实际上比下面的示例复杂得多,因此重新创建它需要大量处理器,而且需要很长时

我有一个控件,它使用
ParentObject
作为其数据上下文。
ParentObject
有一个名为
ChildObject
的属性,该属性可能会更改。执行此操作时,
ParentObject
引发PropertyChanged事件

控件使用XAML为
ChildObject
List
属性中的项定义
ListView
。当
ParentObject
中的
ChildObject
属性更改时,将重新创建整个视图,这意味着将实例化新控件

ListView
实际上比下面的示例复杂得多,因此重新创建它需要大量处理器,而且需要很长时间

我的其他选择是什么?我是否可以为每个
子对象
缓存整个
列表视图
?我该怎么做呢

<ListView ItemsSource="{Binding ParentObject.ChildObject.List}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Error">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <local:ErrorControl DataContext="{Binding ErrorCollection}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

由于您的数据模板,listview正在创建新控件。使用数据模板,数据实例与数据模板内的控件之间存在一对一的关系。您有几个选择:

1) 您研究过虚拟化吗?这将只渲染可见的内容。如果你有大量的对象,你一定要考虑这个问题。 2) 您是否考虑过重新使用视图模型以最小化集合中的更改?而不是在错误更改时添加/删除对象。重新使用集合中的对象,并且仅在总数更改时添加/删除


我已经完成了这两项工作,以减缓视图模型对视图的更改。它们都显著提高了性能,但我的屏幕上有数百个对象。

我的问题不是收藏项目在变化,而是收藏本身在变化。集合中只有(相对)几个项目,但用于显示它们的ListView相当大(比我给出的示例要大)。这就是为什么我想研究缓存整个ListView对象,并在ChildObject更改时替换它。@ken虚拟化是您所需要的。实施选项1。谢谢,但我认为我没有很好地解释我自己。实际上,我想要的是虚拟化的反面:我想要呈现和缓存整个ListView,然后在ParentObject上的ChildObject属性更改时与其他缓存的ListView交换。也许你应该使用多个集合。可以使用每个集合自己的listview为每个集合设置数据模板。老实说,我认为缓存大量信息的性能不如虚拟化。渲染是昂贵的。屏幕上显示的项目百分比是多少。如果这是一个高百分比,那么虚拟化可能不会给您带来太多好处。如果百分比很低,虚拟化是一个很好的选择。感谢您的时间和努力。我最终在代码隐藏中进行了“缓存”。稍后我会将我的方法作为答案发布。是渲染需要时间还是创建列表需要时间?