Cet article explore le concept de surveillance des collections elles-mêmes et les modifications apportées aux éléments de collection. Généralement, ObservableCollection
notifie les modifications apportées à la collection elle-même, mais pas les modifications apportées à ses éléments.
Existe-t-il une collection existante qui peut surveiller les modifications des éléments ?
Oui, vous pouvez créer une implémentation personnalisée étendant ObservableCollection
pour répondre à cette exigence.
ObservableCollection personnalisée avec capacités de surveillance des éléments :
Ceci est une version ObservableCollection
modifiée :
<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>
Utilisez cette collection personnalisée :
<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>(); ((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
Remarques lors de l'utilisation de l'événement PropertyChanged :
Notez que lors de l'utilisation de l'événement PropertyChanged
sur une collection personnalisée, l'expéditeur sera la collection elle-même, et non l'élément qui a changé. Si nécessaire, vous pouvez définir des événements ContainerElementChanged
distincts pour des notifications plus explicites.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!