我正在尝试提高WPF中树形视图的性能。当您打开一个有6000个子节点的节点时,目前需要约13秒才能显示出来。我使用一个ObservableCollection作为子集合,将其与DataTemplate绑定到TransactionViewModel类型,并从视图模型中拉取大约7列数据。
这6000个子节点的TransactionViewModel已经被创建和实例化,但由于您还没有在视觉上显示它们,因此第一次展开节点时需要13秒才能显示。如果您然后收缩并再次展开节点,则会立即显示,不需要任何时间来显示/加载。唯一的区别是,每次XAML绑定调用TransactionviewModel的每个绑定依赖属性的getter方法时,第一次发生了这种情况,而当您第二次重新展开时,由于没有任何更改,所以这些事情都不会再次发生,WPF不再调用getter,可能只是将绑定信息保存在内存中,以备第二次展开时使用。
因此,控件的可视绘制是瞬间完成的,但是第一次打开时(即使这6000个transactionviewmodel对象已经全部加载到子集合中),纯粹的行渲染需要花费时间。
有趣的是,如果我更改DataTemplate以不对视图模型对象上的任何依赖属性进行绑定,只输出一个空白网格,则仍需要8秒钟才能加载。因此,即使没有任何数据绑定调用,树形查看器也需要8秒钟来呈现6000行。每行有5个绑定数据列,则额外5秒给您的成本与基本呈现相比很小。
对我来说,渲染6000个空白行需要8秒钟似乎很高。是否存在任何重要原因导致这种情况发生或在从数据模板呈现XAML到树形视图时要注意的事项?我尝试过只使用空白DataTemplate - 即其中甚至没有一个空白网格,但仍需7秒钟才能完成。
考虑到它然后立即折叠和展开,为什么第一次需要这么长时间,而它甚至没有呈现任何XAML或调用任何数据绑定呢?
此外,异步调用并不是解决方案,因为我的问题不在于GUI响应性,而在于加载数据所花费的时间。用户需要比现在更快地获得数据。
非常感谢