首页 > 后端开发 > C++ > 如何在 C# 中有效地从 ObservableCollection 中添加和删除项目范围?

如何在 C# 中有效地从 ObservableCollection 中添加和删除项目范围?

Patricia Arquette
发布: 2025-01-20 07:01:09
原创
406 人浏览过

How Can I Efficiently Add and Remove Ranges of Items from an ObservableCollection in C#?

ObservableCollection与批量修改

在C#中,ObservableCollection<T>类提供了一种跟踪集合项目更改并通知观察者更改发生的方法。但是,此类不支持AddRange方法。

为了解决这个问题,可以实现自己的ObservableRangeCollection类,该类支持一次添加多个项目。以下是C# 7中更新和优化的版本:

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

public class ObservableRangeCollection<T> : ObservableCollection<T>
{
    public void AddRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException(nameof(collection));

        foreach (var item in collection) Items.Add(item);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    public void RemoveRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException(nameof(collection));

        foreach (var item in collection) Items.Remove(item);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    public void Replace(T item)
    {
        ReplaceRange(new[] { item });
    }

    public void ReplaceRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException(nameof(collection));

        Items.Clear();
        foreach (var item in collection) Items.Add(item);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}
登录后复制

此实现允许您在一个操作中向集合添加或删除多个项目,并且它将通过OnCollectionChanged事件通知观察者更改。

处理集合修改

如果您想在集合修改发生之前处理它们(例如,显示确认对话框),您可以实现INotifyCollectionChanging接口:

public interface INotifyCollectionChanging<T>
{
    event NotifyCollectionChangingEventHandler<T> CollectionChanging;
}
登录后复制
public class ObservableRangeCollection<T> : ObservableCollection<T>, INotifyCollectionChanging<T>
{
    // ...

    protected override void ClearItems()
    {
        var e = new NotifyCollectionChangingEventArgs<T>(NotifyCollectionChangedAction.Reset, Items);
        OnCollectionChanging(e);
        if (e.Cancel) return;

        base.ClearItems();
    }

    // ...

    public event NotifyCollectionChangingEventHandler<T> CollectionChanging;
    protected virtual void OnCollectionChanging(NotifyCollectionChangingEventArgs<T> e)
    {
        CollectionChanging?.Invoke(this, e);
    }
}
登录后复制

这样,您可以处理CollectionChanging事件以取消或修改集合修改操作。

以上是如何在 C# 中有效地从 ObservableCollection 中添加和删除项目范围?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板