항목 변경 시 ObservableCollection에 알림
ObservableCollection의 항목이 변경되는 경우 이러한 변경 사항을 컬렉션에 알려야 합니다. 적절한 UI 업데이트를 확인하세요. ObservableCollection의 기본 동작은 항목 수준 변경 사항을 관찰하는 데 부족하여 대체 솔루션을 모색하게 합니다.
TrulyObservableCollection
한 가지 접근 방식은 TrulyObservableCollection 클래스를 활용하는 것입니다. ObservableCollection은 항목에 대한 PropertyChanged 이벤트에 대한 구독 메커니즘을 포함합니다. 이는 다음과 같이 구현할 수 있습니다.
public class TrulyObservableCollection<T> : ObservableCollection<T> where T : INotifyPropertyChanged { public TrulyObservableCollection() : base() { CollectionChanged += TrulyObservableCollection_CollectionChanged; } void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) { foreach (Object item in e.NewItems) { (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged); } } if (e.OldItems != null) { foreach (Object item in e.OldItems) { (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged); } } } void item_PropertyChanged(object sender, PropertyChangedEventArgs e) { NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset); OnCollectionChanged(a); } }
구현 문제
그러나 TrulyObservableCollection을 사용하면 원하는 결과를 얻지 못할 수 있습니다. 해당 기능을 최대한 활용하려면 MyViewModel 클래스는 MyItemsSource의 CollectionChanged 이벤트에 대한 핸들러를 등록해야 합니다:
public MyViewModel() { MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged; }
대체 접근 방식: 일반 ObservableCollection
대체 방법은 다음과 같습니다. 표준 ObservableCollection을 사용하고 CollectionChanged 내의 항목 수준 PropertyChanged 이벤트를 수동으로 구독합니다. handler:
public MyViewModel() { MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged; // Add items to the collection MyItemsSource.Add(new MyType() { MyProperty = false }); MyItemsSource.Add(new MyType() { MyProperty = true}); MyItemsSource.Add(new MyType() { MyProperty = false }); } 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; } void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "MyProperty") DoWork(); }
이 접근 방식을 사용하면 항목의 MyProperty가 변경될 때 UI 업데이트가 구체적으로 트리거되므로 전체 컬렉션에 걸쳐 대략적인 업데이트가 필요하지 않습니다.
위 내용은 ObservableCollection에 항목 수준 변경 사항을 효율적으로 알리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!