【问题标题】:ListView is creating new controls instead of refreshingListView 正在创建新控件而不是刷新
【发布时间】:2012-08-30 16:09:45
【问题描述】:

我有一个使用ParentObject 作为其DataContext 的控件。 ParentObject 有一个名为 ChildObject 的属性,该属性可能会发生变化。当它发生时,ParentObject 引发 PropertyChanged 事件。

该控件使用 XAML 为 ChildObjectList 属性中的项目定义 ListView。当ChildObject 中的ChildObject 属性发生变化时,会重新创建整个视图,这意味着实例化了新控件。

ListView 实际上比下面的示例复杂得多,因此重新创建它是处理器密集型的并且需要很长时间。

我还有哪些其他选择?我可以为每个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>

【问题讨论】:

  • 是渲染耗时还是创建列表耗时?

标签: c# .net wpf xaml listview


【解决方案1】:

由于您的数据模板,列表视图正在创建新控件。使用数据模板,您可以在数据实例和数据模板内的控件之间建立一对一的关系。您有几个选择:

1) 您是否研究过虚拟化?这只会渲染可见的内容。如果你有大量的对象,你肯定要考虑这个。

2) 您是否考虑过重新设计视图模型以最大程度地减少集合中的变化?而不是在错误发生变化时添加/删除对象。重复使用集合中的对象,并且仅在总计数发生变化时添加/删除。

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

【讨论】:

  • 我的问题不是收藏品在改变,而是收藏本身在改变。集合中只有(相对)少数项目,但用于显示它们的 ListView 非常大(比我给出的示例大)。这就是为什么我想研究缓存整个 ListView 对象并在 ChildObject 更改时替换它。
  • @ken 虚拟化是您所需要的。实施选项 1。
  • 谢谢,但我不认为我解释得很好。我实际上想要与虚拟化相反:我希望渲染和缓存整个 ListView,然后在 ParentObject 上的 ChildObject 属性更改时与其他缓存的 ListView 交换。
  • 或许你应该使用多个集合。您可以使用自己的列表视图对每个集合进行数据模板化。老实说,我认为缓存大量信息的性能不如虚拟化。渲染很昂贵。您在屏幕上显示的项目的百分比是多少。如果它的百分比很高,那么虚拟化可能不会给您带来太多好处。如果百分比很低,那么虚拟化是一个不错的选择。
  • 感谢您的时间和精力。我最终在代码隐藏中进行了“缓存”。稍后我会发布我的方法作为答案。
猜你喜欢
  • 2011-02-02
  • 2022-01-12
  • 2019-01-19
  • 1970-01-01
  • 2019-04-24
  • 2020-08-15
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多