2016-03-05 89 views
0

我在我的WPF应用程序中有一个DataGrid控件。它绑定到Model对象的ObservableCollection。每个Model对象都有一个构造函数,该构造函数将EF-Model对象用作参数。应用程序用户输入正确的凭证后,应该执行一个方法。该方法从DB异步加载数据(大约1000个EF-Model对象)。加载后,我将每个对象传递给Model构造函数(像MyEFModelObjectsCollection.ForEach(o => MyObservableCollection.Add(new Model(o)))一样)。但将这一千个对象加载到我的DataGrid中需要很长时间。我应该如何处理它?将数据加载到datagrid需要太多时间

+1

你可以尝试创建一个ObervableCollection并在构造函数中传入模型。然后将此新的ObervableCollection设置为DataGrid的ItemsSource – Domysee

+0

DataGrid速度很慢。你可以使用ListView/GridView? – Paparazzi

+0

@Frisbee,看起来,你是对的。在向ObservableCollection(AddRange())添加新方法后,我stiil花费了太多时间来加载Data,但是在将我的集合绑定到listview之后,问题就解决了。你能解释一下,为什么datagrid需要花这么多时间来加载数据? – klutch1991

回答

1

使用的ListView/GridView的,除非你需要编辑
如果你只需要基本的编辑(文本框)仍然使用的ListView

DataGrid中做了很多,但它与开销
的数据模型的很多单是方式复杂

1

可能的原因是ObservableCollection.Add()方法每次都会生成事件CollectionChanged。所以它影响你的应用程序的性能。此外ObserverCollection不包含方法AddRange()。但是你可以添加自己的ObservableCollectionEx:ObservableCollection并实现AddRange(IEnumerable collection)方法。你可以找到很多例子来说明如何去做。

+0

我已经实现了AddRange(),但它没有帮助。我也删除了异步执行,但它仍然不起作用。由于我已经全部改变了,我可以看到引发的ContextDeadlock异常。我真的很害怕。 – klutch1991

1

在这种情况下实现更好的用户体验的一个好方法是为每一行都包装一个ViewModel。创建1000个包装并将您的网格绑定到这些新ViewModel的集合。在您的DataGrid列XAML中使用绑定中的FallBack值来显示一个临时值。然后当你的异步数据服务返回你的模型对象时,将每一个传递给一个包装器ViewModel并用新值更新ViewModel的属性,这样网格就可以全面响应,并逐渐显示正确的数据。

+1

这很有趣。你能提供一个小例子或链接吗? – klutch1991

相关问题