最近做一个项目,使用datagrid动态绑定并扩展行列,数据量大概两万条,加载后发现页面近乎卡死状态,查找资料发现是wpf页面渲染问题,以下是解决方案
datagrid控件添加属性VirtualizingPanel.VirtualizationMode="Recycling" EnableRowVirtualization="True" VirtualizingPanel.IsVirtualizing="True" EnableColumnVirtualization="True" VirtualizingPanel.IsContainerVirtualizable="True"
发现页面显示非常快,了解了一下是WPF中的虚拟化技术
相关文章https://www.cnblogs.com/yang-fei/p/6139723.html
1. Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载,仅加载当前需要显示的数据呈现给用户。这种场景会让我们想到数据分页显示,当需要特定页面的数据时,根据页数请求相应数据。
WPF没有提供对Data Virtualization原生态的支持,当时我们可以使用Paging相关技术来实现。在我先前的博客WPF 实现 DataGrid/ListView 分页控件中有介绍。
2. UI Virtualization 是针对数据容器渲染数据项的一个优化。举个例子,一个ListView/ListBox控件中有10000个Item,但是可见的只有10个,那么此时只渲染并显示这10个Item,剩余的9990个Item不实例化和显示。这样可以提高程序的性能。
使用此解决方案发现问题是当我遍历获取datagrid中Cell的时候获取不到,原因是除了当前页面展示cell实例化了 其余并未实例化,所以并不能获取其他cell
当你使用了此方案,但你又需要操作cell,我是动态代码绑定了datatrigger
Style style = new Style();
style.TargetType = typeof(TextBox);
DataTrigger dataTrigger = new DataTrigger();
dataTrigger.Binding = new Binding
{
Path = new PropertyPath("Text"),
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
Mode = BindingMode.TwoWay,
RelativeSource = RelativeSource.Self,
};
dataTrigger.Value = "'";
dataTrigger.Setters.Add(new Setter(FrameworkElement.VisibilityProperty, Visibility.Hidden));
style.Triggers.Add(dataTrigger);
textBox.SetValue( StyleProperty, style);