哪个.Net集合可以一次添加多个对象并收到通知?

Gis*_*shu 34 c# collections .net-3.5

正在考虑System.Collections.ObjectModel ObservableCollection<T>上课.这个很奇怪,因为

  • 它有一个Add方法,只接受一个项目.没有AddRange或等价物.
  • Notification事件参数有一个NewItems属性,它是一个IList(对象..而不是T)

我需要的是将一批对象添加到集合中,并且侦听器还将批处理作为通知的一部分.我错过了ObservableCollection的东西吗?还有其他课程符合我的规范吗?

更新:尽量不要自己动手.我必须建立添加/删除/更改等等.很多东西.


相关问:https:
//stackoverflow.com/questions/670577/observablecollection-doesnt-support-addrange-method-so-i-get-notified-for-each

fry*_*bob 19

似乎INotifyCollectionChanged界面允许在添加多个项目时进行更新,所以我不确定为什么ObservableCollection<T>没有AddRange.您可以为其创建扩展方法AddRange,但这会导致添加的每个项目都发生事件.如果这是不可接受的,您应该能够继承ObservableCollection<T>如下:

public class MyObservableCollection<T> : ObservableCollection<T>
{
    // matching constructors ...

    bool isInAddRange = false;

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        // intercept this when it gets called inside the AddRange method.
        if (!isInAddRange) 
            base.OnCollectionChanged(e);
    }


    public void AddRange(IEnumerable<T> items)
    {
         isInAddRange = true;
         foreach (T item in items)
            Add(item);
         isInAddRange = false;

         var e = new NotifyCollectionChangedEventArgs(
             NotifyCollectionChangedAction.Add,
             items.ToList());
         base.OnCollectionChanged(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用带有多个Item的`AddRange`,则发布的代码不起作用.`CollectionChanged`事件无法处理被更改列表中的多个项目手动引发 - 您得到`不支持范围操作'异常 (6认同)
  • Gishu,ToList()方法是IEnumerable上可用的LINQ扩展方法. (2认同)

Gis*_*shu 6

那个想法和fryguybob的想法一样 - 有点奇怪,ObservableCollection有点半完成了.这件事的事件args甚至没有使用Generics ..让我使用IList(就是这样......昨天:)经过测试的Snippet跟随......

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

namespace MyNamespace
{
    public class ObservableCollectionWithBatchUpdates<T> : ObservableCollection<T>
    {
        public void AddRange(ICollection<T> obNewItems)
        {
            IList<T> obAddedItems = new List<T>();
            foreach (T obItem in obNewItems)
            {
                Items.Add(obItem);
                obAddedItems.Add(obItem);
            }
            NotifyCollectionChangedEventArgs obEvtArgs = new NotifyCollectionChangedEventArgs(
               NotifyCollectionChangedAction.Add, 
               obAddedItems as System.Collections.IList);
            base.OnCollectionChanged(obEvtArgs);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我之前尝试过这种方法.不幸的是,这对WPF绑定不起作用,因为不支持几个项目的通知.请参阅MS Connect上的[此错误](https://connect.microsoft.com/WPF/feedback/details/514922/range-actions-not-supported-in-collectionview) (4认同)

Joe*_*orn 1

继承 List<T> 并重写 Add() 和 AddRange() 方法以引发事件?