>백엔드 개발 >C++ >컬렉션 자체와 요소 모두의 변경 사항을 모니터링하는 컬렉션이 존재합니까?

컬렉션 자체와 요소 모두의 변경 사항을 모니터링하는 컬렉션이 존재합니까?

DDD
DDD원래의
2025-01-07 16:27:41933검색

Does a Collection Exist That Monitors Changes in Both Itself and Its Elements?

감시 요소 변경 모음

이 글에서는 컬렉션 자체를 모니터링하는 개념과 컬렉션 요소의 변경 사항을 살펴봅니다. 일반적으로 ObservableCollection은 컬렉션 자체에 대한 변경 사항을 알리지만 해당 요소에 대한 변경 사항은 알리지 않습니다.

요소 변경 사항을 모니터링할 수 있는 기존 컬렉션이 있나요?

예, ObservableCollection을 확장하여 이 요구 사항을 충족하는 사용자 정의 구현을 만들 수 있습니다.

요소 모니터링 기능을 갖춘 사용자 정의 ObservableCollection:

수정된 ObservableCollection 버전입니다:

<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    // 订阅添加到项目中的 PropertyChanged 事件
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    // 取消订阅从移除的项目中移除的 PropertyChanged 事件,并在清除集合时清除所有项目
    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;
        base.ClearItems();
    }

    // 订阅元素中的 PropertyChanged 事件
    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    // 取消订阅元素中的 PropertyChanged 事件
    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    // 当包含的元素属性更改时发出通知
    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(e);
    }
}</code>

이 맞춤 컬렉션 사용:

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>

PropertyChanged 이벤트 사용 시 참고 사항:

사용자 정의 컬렉션에서 PropertyChanged 이벤트를 사용할 때 전송자는 변경된 요소가 아니라 컬렉션 자체가 됩니다. 필요한 경우 보다 명시적인 알림을 위해 별도의 ContainerElementChanged 이벤트를 정의할 수 있습니다.

위 내용은 컬렉션 자체와 요소 모두의 변경 사항을 모니터링하는 컬렉션이 존재합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.