我有DataGrid
一些DataGridTemplateColumn
,复杂Binding Converter
和一些Style DataTrigger
,并将一些行从EntityFramework
模型绑定到DataGrid ItemsSource
代码后面。
问题是:在这个Binding
过程中UI
一直冻结直到DataGrid ItemContainerGenerator
状态变为ContainersGenerated
,那么解决方案是什么?
我有DataGrid
一些DataGridTemplateColumn
,复杂Binding Converter
和一些Style DataTrigger
,并将一些行从EntityFramework
模型绑定到DataGrid ItemsSource
代码后面。
问题是:在这个Binding
过程中UI
一直冻结直到DataGrid ItemContainerGenerator
状态变为ContainersGenerated
,那么解决方案是什么?
尝试将网格的数据设置为后台优先级。这应该会提高响应能力,直到您可以确定是否还有其他需要优化的地方。
Application.Current.Dispatcher.Invoke(p => this.GridDataItemsSource = data, DispatcherPriority.Background);
如果您的转换器、触发器等的混合在应用为一个大块时会减慢网格中数据的出现速度,请尝试最初将网格设置为您的订单项的空集合,然后将订单项一一插入到网格中在 BackgroundPriority 上使用 Dispatcher
this.GridDataItemsSource = new ObservableCollection<MyLineItems();
foreach(var item in _lineItems)
{
Application.Current.Dispatcher.Invoke(_ => this.GridDataItemsSource.Add(item), DispatcherPriority.Background);
}
效果应该是看到网格随着每个新项目快速更新,并且您的视图应该保持响应。
为了提高性能,EnableRowVirtualization 属性默认设置为 true。当 EnableRowVirtualization 属性设置为 true 时,DataGrid 不会为绑定数据源中的每个数据项实例化 DataGridRow 对象。相反,DataGrid 仅在需要时创建 DataGridRow 对象,并尽可能多地重用它们。例如,DataGrid 为当前在视图中的每个数据项创建一个 DataGridRow 对象,并在它滚动出视图时回收该行。
而不是希望它默认为真,只需将其设置为真,甚至设置为假以查看差异。
如果您在第一次调用项目属性集合时从数据库加载内容,那么您不必怀疑它运行缓慢。将所有数据从数据库传输到 ViewModel 需要一段时间。
无论如何,我会在这里为您删除一些可能对您有所帮助的链接。
要提高性能,请阅读这些提示: