为什么UI在WPF DataGrid绑定期间冻结?

ARZ*_*ARZ 0 wpf user-interface binding datagrid .net-4.0

我有DataGrid一些DataGridTemplateColumn,复杂的Binding Converter和一些Style DataTrigger绑定从EntityFramework模型到DataGrid ItemsSource代码后面的一些行.

问题是:在整个Binding过程中UI一直处于冻结DataGrid ItemContainerGenerator 状态ContainersGenerated,直到状态变为,所以解决方案是什么?

Mar*_*een 6

尝试以背景优先级设置网格数据.这应该可以提高响应速度,直到您可以解决其他任何需要优化的问题.

Application.Current.Dispatcher.Invoke(p => this.GridDataItemsSource = data, DispatcherPriority.Background);
Run Code Online (Sandbox Code Playgroud)

如果您转换器的混合,触发器等当作为一个大疙瘩应用正在放缓在网格中的数据的出现,尝试最初是由一个网格设置为您的订单项的空白集合,然后插入线的项目之一并入电网在BackgroundPriority上使用Dispatcher

this.GridDataItemsSource = new ObservableCollection<MyLineItems();
foreach(var item in _lineItems)
{
   Application.Current.Dispatcher.Invoke(_ => this.GridDataItemsSource.Add(item), DispatcherPriority.Background);
}
Run Code Online (Sandbox Code Playgroud)

效果应该看到电网正在更新很快,每个新的项目,您认为应该保持响应.

  • 有一个可能的问题,如果邮件被延迟,网格将添加一个错误的项目.创建要调用的函数的引用,并将该项作为参数放置,如下所示:this.GridDataItemsSource = new ObservableCollection <MyLineItems(); var del =(Action <MyLineItems>)this.GridDataItemsSource.Add; foreach(_lineItems中的var项){Application.Current.Dispatcher.Invoke(del,DispatcherPriority.Background,item); 此外,如果您从UI线程调用,请使用beginInvoke,以便UI仍然可以自由处理其他消息. (2认同)