Maison > développement back-end > C++ > Comment notifier efficacement une collection observable des modifications de propriétés d'un élément ?

Comment notifier efficacement une collection observable des modifications de propriétés d'un élément ?

Mary-Kate Olsen
Libérer: 2025-01-05 19:33:41
original
185 Les gens l'ont consulté

How to Efficiently Notify an ObservableCollection of Item Property Changes?

Comment notifier ObservableCollection lorsqu'un élément change

La classe ObservableCollection dans .NET fournit un moyen de suivre les modifications apportées à une collection, comme l'ajout ou supprimer des éléments. Cependant, il ne détecte pas automatiquement les modifications apportées aux propriétés des éléments de la collection.

Pour résoudre ce problème, des implémentations personnalisées existent, telles que TrulyObservableCollection mentionnée dans la question. Cette classe étend ObservableCollection et ajoute des gestionnaires d'événements pour les éléments ajoutés et supprimés de la collection. Il suit également les modifications de propriété sur des éléments individuels.

Implémentation et utilisation

Pour utiliser TrulyObservableCollection, vous devez d'abord créer une instance et la remplir avec des éléments :

public class MyViewModel
{
    public TrulyObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new TrulyObservableCollection<MyType>();
        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }
}
Copier après la connexion

Cependant, l'implémentation de TrulyObservableCollection déclenche un événement Reset pour l'ensemble de la collection chaque fois qu'une propriété d'élément change. Cela peut avoir des implications sur les performances et peut ne pas être le comportement souhaité.

Approche alternative

Une approche alternative consiste à enregistrer directement les gestionnaires d'événements de changement de propriété pour chaque élément de la collection. :

public class MyViewModel
{
    public ObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new ObservableCollection<MyType>();
        MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;

        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }

    private void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
            foreach (MyType item in e.NewItems)
                item.PropertyChanged += MyType_PropertyChanged;

        if (e.OldItems != null)
            foreach (MyType item in e.OldItems)
                item.PropertyChanged -= MyType_PropertyChanged;
    }

    private void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "MyProperty")
            DoWork(); // Perform desired action
    }
}
Copier après la connexion

En enregistrant les gestionnaires d'événements de changement de propriété uniquement pour les éléments lorsqu'ils sont ajoutés ou supprimés de la collection, cette approche cible plus efficacement les changements de propriété des éléments tout en évitant les performances. frais généraux.

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