클래스는 항목이 추가, 제거 또는 재배열될 때 알림을 받을 수 있는 동적 데이터 컬렉션을 제공합니다. 하지만 한 번에 여러 항목을 일괄 추가할 수 없는 ObservableCollection
메서드가 부족합니다. 또한 AddRange
인터페이스를 사용하면 변경 사항이 컬렉션에 적용되기 전에 변경 사항을 추적하여 변경 사항을 취소할 수 있습니다. INotifyCollectionChanging
에서 ObservableCollection
메소드를 구현하고 AddRange
을 통합하는 방법은 다음과 같습니다. INotifyCollectionChanging
C#:
<code class="language-csharp">using System; using System.Collections.ObjectModel; using System.Collections.Generic; using System.Collections.Specialized; public class ObservableRangeCollection<T> : ObservableCollection<T>, INotifyCollectionChanging<T> { public event NotifyCollectionChangingEventHandler<T> CollectionChanging; protected override void OnCollectionChanging(NotifyCollectionChangingEventArgs e) { // 创建一个包含更改信息的事件参数 var typedEventArgs = new NotifyCollectionChangingEventArgs<T>(e.Action, e.NewItems != null ? (IEnumerable<T>)e.NewItems : null, e.OldItems != null ? (IEnumerable<T>)e.OldItems : null, e.Index); // 触发自定义事件,允许取消操作 CollectionChanging?.Invoke(this, typedEventArgs); // 检查是否取消 if (typedEventArgs.Cancel) { return; } // 调用基类的OnCollectionChanging方法 base.OnCollectionChanging(e); } public void AddRange(IEnumerable<T> collection) { if (collection == null) { throw new ArgumentNullException(nameof(collection)); } // 触发CollectionChanging事件 OnCollectionChanging(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, collection)); // 添加项目 foreach (T item in collection) { Add(item); } } } //自定义INotifyCollectionChanging接口,用于类型安全 public interface INotifyCollectionChanging<T> : INotifyCollectionChanged { event NotifyCollectionChangingEventHandler<T> CollectionChanging; } //自定义事件处理程序,用于类型安全 public delegate void NotifyCollectionChangingEventHandler<T>(object sender, NotifyCollectionChangingEventArgs<T> e); //自定义事件参数,用于类型安全 public class NotifyCollectionChangingEventArgs<T> : NotifyCollectionChangedEventArgs { public NotifyCollectionChangingEventArgs(NotifyCollectionChangedAction action, IEnumerable<T> newItems) : base(action, newItems) { } public NotifyCollectionChangingEventArgs(NotifyCollectionChangedAction action, IEnumerable<T> newItems, IEnumerable<T> oldItems) : base(action, newItems, oldItems) { } public NotifyCollectionChangingEventArgs(NotifyCollectionChangedAction action, IEnumerable<T> newItems, int index) : base(action, newItems, index) { } public NotifyCollectionChangingEventArgs(NotifyCollectionChangedAction action, T newItem, int index) : base(action, newItem, index) { } public NotifyCollectionChangingEventArgs(NotifyCollectionChangedAction action, T oldItem, int index) : base(action, null, oldItem, index) { } public bool Cancel { get; set; } }</code>
VB.NET:
<code class="language-vb.net">Imports System Imports System.Collections.ObjectModel Imports System.Collections.Generic Imports System.Collections.Specialized Imports System.ComponentModel Public Class ObservableRangeCollection(Of T) Inherits ObservableCollection(Of T) Implements INotifyCollectionChanging(Of T) Public Event CollectionChanging As NotifyCollectionChangingEventHandler(Of T) Implements INotifyCollectionChanging(Of T).CollectionChanging Protected Overrides Sub OnCollectionChanging(e As NotifyCollectionChangedEventArgs) Dim typedEventArgs As New NotifyCollectionChangingEventArgs(Of T)(e.Action, If(e.NewItems IsNot Nothing, DirectCast(e.NewItems, IEnumerable(Of T)), Nothing), If(e.OldItems IsNot Nothing, DirectCast(e.OldItems, IEnumerable(Of T)), Nothing), e.Index) RaiseEvent CollectionChanging(Me, typedEventArgs) If typedEventArgs.Cancel Then Return End If MyBase.OnCollectionChanging(e) End Sub Public Sub AddRange(collection As IEnumerable(Of T)) If collection Is Nothing Then Throw New ArgumentNullException("collection") End If OnCollectionChanging(New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, collection)) For Each item As T In collection Add(item) Next End Sub End Class '自定义INotifyCollectionChanging接口,用于类型安全 Public Interface INotifyCollectionChanging(Of T) Inherits INotifyCollectionChanged Event CollectionChanging As NotifyCollectionChangingEventHandler(Of T) End Interface '自定义事件处理程序,用于类型安全 Public Delegate Sub NotifyCollectionChangingEventHandler(Of T)(sender As Object, e As NotifyCollectionChangingEventArgs(Of T)) '自定义事件参数,用于类型安全 Public Class NotifyCollectionChangingEventArgs(Of T) Inherits NotifyCollectionChangedEventArgs Public Sub New(action As NotifyCollectionChangedAction, newItems As IEnumerable(Of T)) MyBase.New(action, newItems) End Sub Public Sub New(action As NotifyCollectionChangedAction, newItems As IEnumerable(Of T), oldItems As IEnumerable(Of T)) MyBase.New(action, newItems, oldItems) End Sub Public Sub New(action As NotifyCollectionChangedAction, newItems As IEnumerable(Of T), index As Integer) MyBase.New(action, newItems, index) End Sub Public Sub New(action As NotifyCollectionChangedAction, newItem As T, index As Integer) MyBase.New(action, newItem, index) End Sub Public Sub New(action As NotifyCollectionChangedAction, oldItem As T, index As Integer) MyBase.New(action, Nothing, oldItem, index) End Sub Public Property Cancel As Boolean End Class</code>
이벤트에 대한 유형 안전 문제를 처리하고 더욱 강력하게 만들기 위해 코드가 개선되었습니다. 또한 사용자 정의 이벤트가 트리거된 후에도 기본 클래스의 INotifyCollectionChanging
메서드가 계속 호출되도록 OnCollectionChanging
메서드 재정의가 포함되어 있어 OnCollectionChanging
의 정상적인 기능이 보장됩니다. ObservableCollection
위 내용은 .NET의 ObservableCollection에 AddRange 메서드 및 INotifyCollectionChanging을 추가하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!