DataGrid.EnableRowVirtualization属性介绍
DataGrid.EnableRowVirtualization Property (System.Windows.Controls) | Microsoft Learn
该属性默认值是true,开启的作用是根据DataGrid当前视图的高大小来决定从需要从数据源中读取多少条记录进行显示,比如数据源中有10000条数据,DataGrid当前可见视图的高只能够显示50条数据,这样子提升DataGrid加载的速度和节省内存。
DataGrid.EnableColumnVirtualization属性介绍
DataGrid.EnableColumnVirtualization Property (System.Windows.Controls) | Microsoft Learn
该属性的默认值为false,如果你要显示的数据源包含非常多的列,建议把它设置为true,这样可以提升DataGrid加载的速度和节省内存。
使用EnableRowVirtualization和EnableColumnVirtualization属性注意事项
使用WPF中的DataGrid控件时,EnableRowVirtualization和EnableColumnVirtualization属性可以提高数据表格的性能。这两个属性的作用是启用或禁用行和列的虚拟化,以便在需要时只显示可见部分的数据,而不是一次性加载所有数据。
需要注意以下几点:
-
默认情况下,EnableRowVirtualization是启用,EnableColumnVirtualization则是禁用的。如果要启用或者禁用它们,需要在XAML文件中将这两个属性设置为true或者false。
-
启用虚拟化后,DataGrid会根据需要动态加载和卸载行和列。在加载大数据集到DataGrid时可能会导致性能问题。因此,应该根据实际情况来决定是否启用虚拟化。
-
如果启用了虚拟化,但是仍然遇到性能问题,可以考虑使用其他技术来优化数据表格的性能,例如分页、排序等。
-
在代码中,可以通过设置DataGrid的ItemsSource属性来绑定数据源。同时,还可以通过设置DataGrid的AutoGenerateColumns属性为false来手动控制列的生成。这样可以更好地控制DataGrid的行为,并提高性能。
-
确保DataGrid的宽和高在合理范围(比如人为设定width和height属性值),如果是让窗口根据比例自动计算DataGrid的宽和高(比如把DataGrid放在grid组件中),一般也不会发生问题。但是如果你把DataGrid组件放在Grid中,然后Grid组件放在Expander组件中,如果不人为限定DataGrid的高度,这时候DataGrid的高度会根据数据源的真实个数乘以每行的高度来来计算DataGrid的高度,也就是说及时EnableRowVirtualization=true,但实际上并没有按照预期发挥作用。
使用案例
这里的DataGrid绑定的数据源超过显示10000+ 行数据,通过“<RowDefinition Height="400"/>”来设置它最大高度为400,如果把“<RowDefinition Height="400"/>”修改为“<RowDefinition Height="*"/>”或者“<RowDefinition Height="auto"/>”,将会导致“EnableRowVirtualization=true”失效,花了将近6分钟,才把10000+行的数据初始化完成,同时程序也占用了大量的内存,并且DataGrid的垂直滚动条并没有出现,说明DataGrid是直接把所有的行的高度相加作为它自身的高度。