首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ObservableCollection不支持AddRange方法,所以添加的每一项都会通知我,除了INotifyCollectionChanging呢?

ObservableCollection不支持AddRange方法,所以添加的每一项都会通知我,除了INotifyCollectionChanging呢?
EN

Stack Overflow用户
提问于 2009-03-22 05:08:44
回答 11查看 121.7K关注 0票数 183

我希望能够添加一个范围,并获得整个批量更新。

我还希望能够在操作完成之前取消该操作(即,除了“已更改”之外,集合还会发生变化)。

相关Q Which .Net collection for adding multiple objects at once and getting notified?

EN

回答 11

Stack Overflow用户

发布于 2009-05-12 04:26:27

我认为AddRange更好的实现方式如下:

代码语言:javascript
复制
public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) Items.Add(i);
    OnCollectionChanged(
        new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}

它为您保存了一个列表副本。此外,如果你想进行微优化,你可以添加多达N个项目,如果添加的项目超过N个,则进行重置。

票数 33
EN

Stack Overflow用户

发布于 2009-03-22 10:08:08

您必须小心地将UI绑定到您的自定义集合--默认的CollectionView类只支持单个项通知。

票数 14
EN

Stack Overflow用户

发布于 2011-12-09 01:09:20

需要OnPropertyChanged("Count")OnPropertyChanged("Item[]")调用才能按照ObservableCollection运行的证明。请注意,如果您不费心,我不知道后果是什么!

下面是一个测试方法,它显示了一个正常的可观察集合中的每个add都有两个PropertyChange事件。一个用于"Count",另一个用于"Item[]"

代码语言:javascript
复制
[TestMethod]
public void TestAddSinglesInOldObsevableCollection()
{
  int colChangedEvents = 0;
  int propChangedEvents = 0;
  var collection = new ObservableCollection<object>();
  collection.CollectionChanged += (sender, e) => { colChangedEvents++; };
  (collection as INotifyPropertyChanged).PropertyChanged += (sender, e) => { propChangedEvents++; };
  collection.Add(new object());
  collection.Add(new object());
  collection.Add(new object());
  Assert.AreEqual(3, colChangedEvents);
  Assert.AreEqual(6, propChangedEvents);
}

@Shimmy,交换您的集合的标准,并更改为添加范围,您将获得零PropertyChanges。请注意,集合更改确实工作得很好,但并不完全像ObservableCollection那样工作。因此,测试shimmy集合如下所示:

代码语言:javascript
复制
[TestMethod]
public void TestShimmyAddRange()
{
  int colChangedEvents = 0;
  int propChangedEvents = 0;
  var collection = new ShimmyObservableCollection<object>();
  collection.CollectionChanged += (sender, e) => { colChangedEvents++; };
  (collection as INotifyPropertyChanged).PropertyChanged += (sender, e) => { propChangedEvents++; };
  collection.AddRange(new[]{
    new object(), new object(), new object(), new object()}); //4 objects at once
  Assert.AreEqual(1, colChangedEvents);  //great, just one!
  Assert.AreEqual(2, propChangedEvents); //fails, no events :(
}

仅供参考,这里是来自ObservableCollection的InsertItem (也被Add调用)的代码:

代码语言:javascript
复制
protected override void InsertItem(int index, T item)
{
  base.CheckReentrancy();
  base.InsertItem(index, item);
  base.OnPropertyChanged("Count");
  base.OnPropertyChanged("Item[]");
  base.OnCollectionChanged(NotifyCollectionChangedAction.Add, item, index);
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/670577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档