Heim > Backend-Entwicklung > C++ > Wie lässt sich ObservableCollection benachrichtigen, wenn sich Elementeigenschaften ändern?

Wie lässt sich ObservableCollection benachrichtigen, wenn sich Elementeigenschaften ändern?

Barbara Streisand
Freigeben: 2025-01-04 12:12:35
Original
607 Leute haben es durchsucht

How to Make ObservableCollection Notify When Item Properties Change?

ObservableCollection bei Elementänderungen benachrichtigen

ObservableCollection ist ein praktischer Sammlungstyp, der die INotifyCollectionChanged-Schnittstelle implementiert, mit der Sie auf Änderungen in der Sammlung warten können . ObservableCollection benachrichtigt jedoch nicht über Änderungen an Eigenschaften der Elemente in der Sammlung.

Überwindung der Einschränkung

Um diese Einschränkung zu beheben, können Sie eine benutzerdefinierte ObservableCollection implementieren namens TrulyObservableCollection, das von ObservableCollection erbt und den CollectionChanged-Ereignishandler überschreibt, um das Abonnement zu abonnieren und abzubestellen PropertyChanged-Ereignis von Elementen, die zur Sammlung hinzugefügt und daraus entfernt wurden.

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);
    }
}
Nach dem Login kopieren

Verwendung

Um TrulyObservableCollection zu verwenden, Ersetzen Sie einfach ObservableCollection durch TrulyObservableCollection in Ihrem Code. Sie müssen Handler an das CollectionChanged-Ereignis der Sammlung anhängen, um Änderungen zu verarbeiten.

MyItemsSource = new TrulyObservableCollection<MyType>();
MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
Nach dem Login kopieren

Innerhalb des CollectionChanged-Ereignishandlers können Sie die PropertyChanged-Ereignisse von Elementen abonnieren oder abbestellen, die zur Sammlung hinzugefügt und daraus entfernt wurden.

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);
}
Nach dem Login kopieren

Alternativer Ansatz

Während Mit TrulyObservableCollection können Sie Benachrichtigungen über Sammlungsänderungen erzwingen. Dies ist möglicherweise nicht der optimale Ansatz. Ein häufigeres Muster besteht darin, PropertyChanged-Ereignisse einzelner Elemente innerhalb des CollectionChanged-Handlers von ObservableCollection zu verarbeiten. Dadurch wird sichergestellt, dass nur bestimmte Eigenschaftsänderungen innerhalb der Sammlung zu Aktualisierungen der Benutzeroberfläche führen, was die Leistung optimiert und eine detailliertere Kontrolle ermöglicht.

Das obige ist der detaillierte Inhalt vonWie lässt sich ObservableCollection benachrichtigen, wenn sich Elementeigenschaften ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage