一尘不染

如何在替换所有元素或添加元素集合时避免多次触发ObservableCollection.CollectionChanged

c#

我有ObservableCollection<T>集合,我想用新的元素集合替换所有元素,我可以这样做:

collection.Clear();

要么:

collection.ClearItems();

(顺便说一句,这两种方法有什么区别?)

我也foreach可以collection.Add一一习惯,但这会触发多次

添加元素集合时相同。

编辑:

我在这里找到了一个不错的库:增强型ObservableCollection,具有延迟或禁用通知的功能,但它似乎不支持silverlight。


阅读 613

收藏
2020-05-19

共1个答案

一尘不染

ColinE提供的所有信息都是正确的。我只想添加ObservableCollection用于此特定情况的子类。

public class SmartCollection<T> : ObservableCollection<T> {
    public SmartCollection()
        : base() {
    }

    public SmartCollection(IEnumerable<T> collection)
        : base(collection) {
    }

    public SmartCollection(List<T> list)
        : base(list) {
    }

    public void AddRange(IEnumerable<T> range) {
        foreach (var item in range) {
            Items.Add(item);
        }

        this.OnPropertyChanged(new PropertyChangedEventArgs("Count"));
        this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
        this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    public void Reset(IEnumerable<T> range) {
        this.Items.Clear();

        AddRange(range);
    }
}
2020-05-19