Maison > développement back-end > C++ > Existe-t-il une collection qui surveille les changements à la fois en elle-même et dans ses éléments ?

Existe-t-il une collection qui surveille les changements à la fois en elle-même et dans ses éléments ?

DDD
Libérer: 2025-01-07 16:27:41
original
904 Les gens l'ont consulté

Does a Collection Exist That Monitors Changes in Both Itself and Its Elements?

Une collection de modifications d'éléments de surveillance

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>
Copier après la connexion

Utilisez cette collection personnalisée :

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal