Heim > Backend-Entwicklung > C++ > Existiert eine ObservableCollection, die sowohl Sammlungs- als auch Elementeigenschaftenänderungen verfolgt?

Existiert eine ObservableCollection, die sowohl Sammlungs- als auch Elementeigenschaftenänderungen verfolgt?

Susan Sarandon
Freigeben: 2025-01-07 16:36:40
Original
829 Leute haben es durchsucht

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

ObservableCollection, die Sammlungs- und Elementattributänderungen überwacht

Frage:

Gibt es eine Sammlung, die gleichzeitig Änderungen in der Sammlung selbst und Änderungen in den Attributen ihrer Elemente überwachen kann?

Lösung:

Wenn keine fertige Sammlung diese Anforderung erfüllt, können Sie eine Implementierung erstellen, die ObservableCollection erweitert, um ihre Elemente auf PropertyChanged-Ereignisse zu überwachen.

Umsetzung:

Das Folgende ist eine Beispielimplementierung von ObservableCollectionEx, die diese Funktionalität implementiert:

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

Verwendung:

Verwenden Sie ObservableCollection wie ein normales ObservableCollectionEx, konvertieren Sie es jedoch in ein INotifyPropertyChanged, um die Eigenschaftsänderungsereignisse seines Elements zu abonnieren:

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
Nach dem Login kopieren

Hinweis: In der ContainedElementChanged-Methode muss der Parameter von OnPropertyChanged eine neue PropertyChangedEventArgs-Instanz sein, anstatt e direkt zu verwenden. Dies wurde im obigen Code korrigiert. Dadurch wird sichergestellt, dass der korrekte Eigenschaftsname an den Ereignishandler übergeben wird.

Das obige ist der detaillierte Inhalt vonExistiert eine ObservableCollection, die sowohl Sammlungs- als auch Elementeigenschaftenänderungen verfolgt?. 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