2016-03-05 109 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