Maison > développement back-end > C++ > Comment faire en sorte qu'ObservableCollection soit averti lorsque les propriétés d'un élément changent ?

Comment faire en sorte qu'ObservableCollection soit averti lorsque les propriétés d'un élément changent ?

Barbara Streisand
Libérer: 2025-01-04 12:12:35
original
664 Les gens l'ont consulté

How to Make ObservableCollection Notify When Item Properties Change?

Notifier ObservableCollection lorsque l'élément change

ObservableCollection est un type de collection pratique qui implémente l'interface INotifyCollectionChanged, qui vous permet d'écouter les modifications dans la collection . Cependant, ObservableCollection ne notifie pas les modifications apportées aux propriétés des éléments de la collection.

Surmonter la limitation

Pour résoudre cette limitation, vous pouvez implémenter une ObservableCollection personnalisée. appelé TrulyObservableCollection, qui hérite d'ObservableCollection et remplace le gestionnaire d'événements CollectionChanged pour s'abonner et se désinscrire du Événement PropertyChanged des éléments ajoutés et supprimés de la collection.

TrulyObservableCollection

public class TrulyObservableCollection<T> : ObservableCollection<T>
where T : INotifyPropertyChanged
{
    public TrulyObservableCollection()
        : base()
    {
        CollectionChanged += TrulyObservableCollection_CollectionChanged;
    }

    void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        OnCollectionChanged(a);
    }
}
Copier après la connexion

Utilisation

Pour utiliser TrulyObservableCollection, remplacez simplement ObservableCollection par TrulyObservableCollection dans votre code. Vous devez attacher des gestionnaires à l'événement CollectionChanged de la collection pour gérer les modifications.

MyItemsSource = new TrulyObservableCollection<MyType>();
MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
Copier après la connexion

Dans le gestionnaire d'événements CollectionChanged, vous pouvez vous abonner ou vous désabonner aux événements PropertyChanged des éléments ajoutés et supprimés de la collection.

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

    if (e.OldItems != null)
        foreach (MyType item in e.OldItems)
            item.PropertyChanged -= new PropertyChangedEventHandler(MyType_PropertyChanged);
}
Copier après la connexion

Approche alternative

Pendant TrulyObservableCollection vous permet de forcer les notifications de modification de collection, ce n'est peut-être pas l'approche la plus optimale. Un modèle plus courant consiste à gérer les événements PropertyChanged d’éléments individuels dans le gestionnaire CollectionChanged d’ObservableCollection. Cela garantit que seules les modifications de propriétés spécifiques au sein de la collection entraînent des mises à jour de l'interface utilisateur, optimisant ainsi les performances et offrant un contrôle plus granulaire.

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!

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