我有ObservableCollection
,我可以在集合中添加和删除项目。但我无法替换集合中的现有项目。有一种方法可以替换项目并将其反映在我的绑定组件上。
System.Collections.Specialized.NotifyCollectionChangedAction.Replace
有人可以告诉我如何做到这一点吗?
答案 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}}方法的想法值得一试。