Observable Collection替换项目

时间:2011-07-29 13:03:34

标签: wpf binding replace observablecollection

我有ObservableCollection,我可以在集合中添加和删除项目。但我无法替换集合中的现有项目。有一种方法可以替换项目并将其反映在我的绑定组件上。

System.Collections.Specialized.NotifyCollectionChangedAction.Replace

有人可以告诉我如何做到这一点吗?

2 个答案:

答案 0 :(得分:54)

collection[someIndex] = newItem;

答案 1 :(得分:3)

已更新:Indexer使用已覆盖的SetItem并通知有关更改。

我认为使用索引器的答案可能是错误,因为问题是关于替换并通知

只是为了澄清:ObservableCollection<T>使用其基类Collection<T>类的索引器,而后者又是List<T>的包装器,它是T的简单数组的包装器。 。并且ObservableCollection实现中的索引器方法没有覆盖。

因此,当您使用索引器替换 ObservableCollection 中的项时,它会从集合类调用以下代码:

public T this[int index] {
        get { return items[index]; }
        set {
            if( items.IsReadOnly) {
                ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
            }

            if (index < 0 || index >= items.Count) {
                ThrowHelper.ThrowArgumentOutOfRangeException();
            }

            SetItem(index, value);
        }

它只是检查边界并调用使用底层 List 类的索引器的SetItem:

protected virtual void SetItem(int index, T item) {
        items[index] = item;
    }

在分配期间,没有对CollectionChanged事件的调用,因为基础集合对此一无所知。

但是当你使用SetItem方法时,它是从ObservableCollection类调用的:

protected override void SetItem(int index, T item)
    {
        CheckReentrancy();
        T originalItem = this[index];
        base.SetItem(index, item);

        OnPropertyChanged(IndexerName);
        OnCollectionChanged(NotifyCollectionChangedAction.Replace, originalItem, item, index);
    }

分配后,它会调用OnCollectionChanged方法,该方法会使用CollectionChanged操作参数触发NotifyCollectionChangedAction.Replace事件。

    protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (CollectionChanged != null)
        {
            using (BlockReentrancy())
            {
                CollectionChanged(this, e);
            }
        }
    }

作为结论:继承自ObservableCollection的自定义类和调用Replace的{​​{1}}方法的想法值得一试。