>백엔드 개발 >C++ >ObservableCollection에 항목 속성 변경 사항을 효율적으로 알리는 방법은 무엇입니까?

ObservableCollection에 항목 속성 변경 사항을 효율적으로 알리는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-05 19:33:41182검색

How to Efficiently Notify an ObservableCollection of Item Property Changes?

항목 변경 시 ObservableCollection에 알리는 방법

.NET의 ObservableCollection 클래스는 추가와 같은 컬렉션 변경 사항을 추적하는 수단을 제공합니다. 또는 항목을 제거합니다. 그러나 컬렉션 내의 항목 속성에 대한 변경 사항을 자동으로 감지하지 않습니다.

이 문제를 해결하기 위해 질문에 언급된 TrulyObservableCollection과 같은 사용자 정의 구현이 존재합니다. 이 클래스는 ObservableCollection을 확장하고 컬렉션에 추가 및 제거된 항목에 대한 이벤트 처리기를 추가합니다. 또한 개별 항목의 속성 변경 사항도 추적합니다.

구현 및 사용

TrulyObservableCollection을 사용하려면 먼저 인스턴스를 만들고 항목으로 채웁니다.

public class MyViewModel
{
    public TrulyObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new TrulyObservableCollection<MyType>();
        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }
}

그러나 TrulyObservableCollection을 구현하면 전체에 대해 재설정 이벤트가 발생합니다. 항목 속성이 변경될 때마다 수집됩니다. 이는 성능에 영향을 미칠 수 있으며 원하는 동작이 아닐 수도 있습니다.

대체 접근 방식

대체 접근 방식은 컬렉션의 각 항목에 대해 속성 변경 이벤트 핸들러를 직접 등록하는 것입니다. :

public class MyViewModel
{
    public ObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new ObservableCollection<MyType>();
        MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;

        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }

    private void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
            foreach (MyType item in e.NewItems)
                item.PropertyChanged += MyType_PropertyChanged;

        if (e.OldItems != null)
            foreach (MyType item in e.OldItems)
                item.PropertyChanged -= MyType_PropertyChanged;
    }

    private void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "MyProperty")
            DoWork(); // Perform desired action
    }
}

컬렉션에 항목이 추가되거나 제거될 때 항목에 대해서만 속성 변경 이벤트 핸들러를 등록함으로써 이 접근 방식은 다음을 목표로 합니다. 성능 오버헤드를 피하면서 항목 속성을 보다 효과적으로 변경합니다.

위 내용은 ObservableCollection에 항목 속성 변경 사항을 효율적으로 알리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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