Maison > développement back-end > C++ > Existe-t-il une ObservableCollection qui suit les modifications des propriétés de collection et d'élément ?

Existe-t-il une ObservableCollection qui suit les modifications des propriétés de collection et d'élément ?

Susan Sarandon
Libérer: 2025-01-07 16:36:40
original
829 Les gens l'ont consulté

Does an ObservableCollection Exist That Tracks Both Collection and Element Property Changes?

ObservableCollection qui surveille les modifications des attributs de collection et d'élément

Question :

Existe-t-il une collection capable de surveiller simultanément les changements dans la collection elle-même et les changements dans les attributs de ses éléments ?

Solution :

Si aucune collection prête à l'emploi ne répond à cette exigence, vous pouvez créer une implémentation qui étend ObservableCollection pour surveiller ses éléments pour PropertyChanged événements.

Mise en œuvre :

Ce qui suit est un exemple d'implémentation de ObservableCollectionEx qui implémente cette fonctionnalité :

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

Utilisation :

Utilisez ObservableCollection comme un ObservableCollectionEx normal, mais convertissez-le en INotifyPropertyChanged pour vous abonner aux événements de changement de propriété de son élément :

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

Remarque : dans la méthode ContainedElementChanged, le paramètre de OnPropertyChanged doit être une nouvelle instance de PropertyChangedEventArgs au lieu d'utiliser e directement. Cela a été corrigé dans le code ci-dessus. Cela garantit que le nom de propriété correct est transmis au gestionnaire d'événements.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal