当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《哪个.Net集合可以一次添加多个对象并收到通知?》经验,为你挑选了2个好方法。

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

它有一个Add方法,只接受一个项目.没有AddRange或等价物.

Notification事件参数有一个NewItems属性,它是一个IList(对象..而不是T)

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

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


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



1> fryguybob..:

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

public class MyObservableCollection : ObservableCollection
{
    // 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 items)
    {
         isInAddRange = true;
         foreach (T item in items)
            Add(item);
         isInAddRange = false;

         var e = new NotifyCollectionChangedEventArgs(
             NotifyCollectionChangedAction.Add,
             items.ToList());
         base.OnCollectionChanged(e);
    }
}


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

2> Gishu..:

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

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

namespace MyNamespace
{
    public class ObservableCollectionWithBatchUpdates : ObservableCollection
    {
        public void AddRange(ICollection obNewItems)
        {
            IList obAddedItems = new List();
            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);
        }

    }
}


我之前尝试过这种方法.不幸的是,这对WPF绑定不起作用,因为不支持几个项目的通知.请参阅MS Connect上的[此错误](https://connect.microsoft.com/WPF/feedback/details/514922/range-actions-not-supported-in-collectionview)
推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有