2016-09-07 93 views
2

我注意到如果我使用RemoveRange從ObservableCollection中刪除所有項目,它會更新用戶界面,但是如果至少剩下單個項目,則不會。通過查看ObservableCollection源代碼here,我看不到他們正在做什麼來刷新內部Items集合。我基本上是分類ObservableCollection並實現我自己的OnCollectionChanged行爲,以防止UI性能問題,並面臨這個問題。這個方向有什麼想法?任何有關如何刷新observablecollection的指針?刷新ObservableCollection

感謝, 周杰倫

回答

0

總之觀察集合觸發NotifyProperty改變事件的底層集合所做的更改。所以,如果你看到的公共方法可以在觀察集合的源代碼,你提到你會看到執行InsertItem,的removeItem,ClearItems等..他們叫OnPropertyChanged(IndexerName);

至於RemoveRange方法時不通過的ObservableCollection而是由實施底層列表,它不會調用OnPropertyChanged(IndexerName);,因此您不會觀察UI中的更改。我建議你不要使用刪除範圍,而是循環遍歷項目並逐個刪除它們。

您可以看到removerange實施 - https://stackoverflow.com/a/670579/442444

+0

當我逐一刪除它們或逐個添加它們時,性能會受到影響。它會爲綁定的DataGrid控件導致3000+的UI通知,並凍結UI。 –

+0

查看上面提供的鏈接,它的實現只針對一個範圍通知一次。 – CarbineCoder

+0

謝謝。我已經知道這個鏈接。我嘗試了它,並遵循相同的方法,但仍然沒有看到UI的更改。我也顯式調用了Items []和Count的屬性。 –

1

你使用NotifyCollectionChangedEventArgsOldItemsNewItems當你的UI在OnCollectionChanged激活?

ClearItems方法或添加/ @CarbineCoder答案的鏈接刪除Range方法不作OldItemsNewItemsNotifyCollectionChangedEventArgs。 它只有NotifyCollectionChangedAction.Reset

我想如果你的UI代碼修改根據OldItemsNewItems它不工作呼籲ClearItems或自定義實現的範圍方法,如鏈接。

+0

讓我試試看! –

+0

祝福有錯誤:構造函數只支持'Replace'操作。 您的觀察與OldItems和NewItems似乎是正確的,但沒有辦法爲他們提供重置操作。 –