컬렉션 및 요소 속성 변경을 모니터링하는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!