>백엔드 개발 >C++ >컬렉션과 요소 속성 변경 사항을 모두 추적하는 ObservableCollection이 존재합니까?

컬렉션과 요소 속성 변경 사항을 모두 추적하는 ObservableCollection이 존재합니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-07 16:36:40849검색

Does an ObservableCollection Exist That Tracks Both Collection and Element Property Changes?

컬렉션 및 요소 속성 변경을 모니터링하는 ObservableCollection

질문:

컬렉션 자체의 변경 사항과 해당 요소 속성의 변경 사항을 동시에 모니터링할 수 있는 컬렉션이 있나요?

해결책:

미리 만들어진 컬렉션이 이 요구 사항을 충족하지 않으면 ObservableCollection을 확장하여 PropertyChanged 이벤트에 대한 요소를 모니터링하는 구현을 만들 수 있습니다.

구현:

다음은 이 기능을 구현하는 ObservableCollectionEx의 구현 예입니다.

<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Unsubscribe(e.OldItems);
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;

        base.ClearItems();
    }

    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(e.PropertyName)); //Corrected this line.
    }
}</code>

사용법:

ObservableCollection를 일반적인 ObservableCollectionEx처럼 사용하되 해당 요소의 속성 변경 이벤트를 구독하려면 INotifyPropertyChanged으로 변환하세요.

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

참고: ContainedElementChanged 메소드에서 OnPropertyChanged의 매개변수는 PropertyChangedEventArgs를 직접 사용하는 대신 새 e 인스턴스여야 합니다. 위 코드에서는 이 문제가 수정되었습니다. 이렇게 하면 올바른 속성 이름이 이벤트 처리기에 전달됩니다.

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

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