この記事では、コレクション自体とコレクション要素の変更を監視する概念について説明します。通常、ObservableCollection
はコレクション自体への変更を通知しますが、その要素への変更は通知しません。
要素の変更を監視できる既存のコレクションはありますか?
はい、この要件を満たすために ObservableCollection
を拡張するカスタム実装を作成できます。
要素監視機能を備えたカスタム ObservableCollection:
これは変更された ObservableCollection
バージョンです:
<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged { // 订阅添加到项目中的 PropertyChanged 事件 protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { Subscribe(e.NewItems); base.OnCollectionChanged(e); } // 取消订阅从移除的项目中移除的 PropertyChanged 事件,并在清除集合时清除所有项目 protected override void ClearItems() { foreach (T element in this) element.PropertyChanged -= ContainedElementChanged; base.ClearItems(); } // 订阅元素中的 PropertyChanged 事件 private void Subscribe(IList iList) { if (iList != null) { foreach (T element in iList) element.PropertyChanged += ContainedElementChanged; } } // 取消订阅元素中的 PropertyChanged 事件 private void Unsubscribe(IList iList) { if (iList != null) { foreach (T element in iList) element.PropertyChanged -= ContainedElementChanged; } } // 当包含的元素属性更改时发出通知 private void ContainedElementChanged(object sender, PropertyChangedEventArgs e) { OnPropertyChanged(e); } }</code>
このカスタム コレクションを使用します:
<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>(); ((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
PropertyChanged イベント使用時の注意:
カスタム コレクションで PropertyChanged
イベントを使用する場合、送信者は変更された要素ではなく、コレクション自体になることに注意してください。必要に応じて、より明示的な通知のために別の ContainerElementChanged
イベントを定義できます。
以上がそれ自体とその要素の両方の変更を監視するコレクションは存在しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。