太长的帖子无法在评论中,所以在这里作为答案。
正如ananthonline发布的那样,您可以继承 ObservableCollection。
但是,不幸的是,这只是工作的一半。原因是集合隐式使用集合视图作为项目控制的项目源绑定。
而作为 WPF 中所有默认集合视图的基类型的CollectionView不支持批量集合更新:
private void ValidateCollectionChangedEventArgs(NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
{
if (e.NewItems.Count != 1)
{
throw new NotSupportedException(SR.Get("RangeActionsNotSupported"));
}
break;
}
case NotifyCollectionChangedAction.Remove:
{
if (e.OldItems.Count != 1)
{
throw new NotSupportedException(SR.Get("RangeActionsNotSupported"));
}
if (e.OldStartingIndex < 0)
{
throw new InvalidOperationException(SR.Get("RemovedItemNotFound"));
}
break;
}
case NotifyCollectionChangedAction.Replace:
{
if (e.NewItems.Count != 1 || e.OldItems.Count != 1)
{
throw new NotSupportedException(SR.Get("RangeActionsNotSupported"));
}
break;
}
case NotifyCollectionChangedAction.Move:
{
if (e.NewItems.Count != 1)
{
throw new NotSupportedException(SR.Get("RangeActionsNotSupported"));
}
if (e.NewStartingIndex < 0)
{
throw new InvalidOperationException(SR.Get("CannotMoveToUnknownPosition"));
}
break;
}
case NotifyCollectionChangedAction.Reset:
{
break;
}
default:
{
throw new NotSupportedException(SR.Get("UnexpectedCollectionChangeAction", new object[]
{
e.Action
}));
}
}
}
...并且您必须实现 ICollectionView。我不确定,这是正确的方法。