항목 변경 시 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!