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

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

Patricia Arquette
Patricia Arquette原创
2025-01-20 07:01:09340浏览

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

ObservableCollection与批量修改

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

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

<code class="language-csharp">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));
    }
}</code>

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

处理集合修改

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

<code class="language-csharp">public interface INotifyCollectionChanging<T>
{
    event NotifyCollectionChangingEventHandler<T> CollectionChanging;
}</code>
<code class="language-csharp">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);
    }
}</code>

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

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn