Heim > Backend-Entwicklung > C++ > Wie kann eine ObservableCollection effizient über Änderungen auf Elementebene benachrichtigt werden?

Wie kann eine ObservableCollection effizient über Änderungen auf Elementebene benachrichtigt werden?

Linda Hamilton
Freigeben: 2025-01-05 04:04:39
Original
301 Leute haben es durchsucht

How to Efficiently Notify an ObservableCollection of Item-Level Changes?

ObservableCollection über Elementänderungen benachrichtigen

In Fällen, in denen Elemente in einer ObservableCollection Änderungen unterliegen, ist es notwendig, die Sammlung über diese Änderungen zu informieren Stellen Sie sicher, dass die Benutzeroberfläche ordnungsgemäß aktualisiert wird. Das Standardverhalten von ObservableCollection reicht nicht aus, um Änderungen auf Elementebene zu beobachten, was die Suche nach alternativen Lösungen anregt.

TrulyObservableCollection

Ein Ansatz besteht darin, die TrulyObservableCollection-Klasse zu verwenden, die erweitert wird ObservableCollection und enthält einen Abonnementmechanismus für PropertyChanged-Ereignisse für seine Elemente. Dies kann wie folgt implementiert werden:

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

Implementierungsprobleme

Die Verwendung von TrulyObservableCollection führt jedoch möglicherweise nicht zu den gewünschten Ergebnissen. Um ihre Fähigkeiten voll auszuschöpfen, muss die MyViewModel-Klasse einen Handler für das CollectionChanged-Ereignis von MyItemsSource registrieren:

public MyViewModel()
{
    MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
}
Nach dem Login kopieren

Alternativer Ansatz: Reguläre ObservableCollection

Eine alternative Methode ist um eine Standard-ObservableCollection zu verwenden und PropertyChanged-Ereignisse auf Elementebene innerhalb der CollectionChanged manuell zu abonnieren Handler:

public MyViewModel()
{
    MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
    
    // Add items to the collection
    MyItemsSource.Add(new MyType() { MyProperty = false });
    MyItemsSource.Add(new MyType() { MyProperty = true});
    MyItemsSource.Add(new MyType() { MyProperty = false });
}

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;
}

void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "MyProperty")
        DoWork();
}
Nach dem Login kopieren

Bei diesem Ansatz werden UI-Aktualisierungen speziell dann ausgelöst, wenn sich die MyProperty eines Elements ändert, wodurch die Notwendigkeit grober Aktualisierungen in der gesamten Sammlung entfällt.

Das obige ist der detaillierte Inhalt vonWie kann eine ObservableCollection effizient über Änderungen auf Elementebene benachrichtigt werden?. 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