0

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

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

4

2 回答 2

7

尝试将网格的数据设置为后台优先级。这应该会提高响应能力,直到您可以确定是否还有其他需要优化的地方。

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);
}

效果应该是看到网格随着每个新项目快速更新,并且您的视图应该保持响应。

于 2013-10-22T08:49:08.580 回答
1

为了提高性能,EnableRowVirtualization 属性默认设置为 true。当 EnableRowVirtualization 属性设置为 true 时,DataGrid 不会为绑定数据源中的每个数据项实例化 DataGridRow 对象。相反,DataGrid 仅在需要时创建 DataGridRow 对象,并尽可能多地重用它们。例如,DataGrid 为当前在视图中的每个数据项创建一个 DataGridRow 对象,并在它滚动出视图时回收该行。

而不是希望它默认为真,只需将其设置为真,甚至设置为假以查看差异。

如果您在第一次调用项目属性集合时从数据库加载内容,那么您不必怀疑它运行缓慢。将所有数据从数据库传输到 ViewModel 需要一段时间。

无论如何,我会在这里为您删除一些可能对您有所帮助的链接。

要提高性能,请阅读这些提示:

http://wpftutorial.net/10PerformanceTips.html

http://msdn.microsoft.com/en-us/library/bb613546.aspx

于 2013-10-22T07:03:58.963 回答