Heim > Backend-Entwicklung > C++ > Gibt es eine Sammlung, die Änderungen sowohl an sich selbst als auch an ihren Elementen überwacht?

Gibt es eine Sammlung, die Änderungen sowohl an sich selbst als auch an ihren Elementen überwacht?

DDD
Freigeben: 2025-01-07 16:27:41
Original
904 Leute haben es durchsucht

Does a Collection Exist That Monitors Changes in Both Itself and Its Elements?

Eine Sammlung von Überwachungselementänderungen

In diesem Artikel wird das Konzept der Überwachung von Sammlungen selbst und von Änderungen an Sammlungselementen untersucht. Normalerweise benachrichtigt ObservableCollection Änderungen an der Sammlung selbst, jedoch keine Änderungen an ihren Elementen.

Gibt es eine bestehende Sammlung, die Elementänderungen überwachen kann?

Ja, Sie können eine benutzerdefinierte Implementierung erstellen, die ObservableCollection erweitert, um diese Anforderung zu erfüllen.

Benutzerdefinierte ObservableCollection mit Elementüberwachungsfunktionen:

Dies ist eine modifizierte ObservableCollection Version:

<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    // 订阅添加到项目中的 PropertyChanged 事件
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    // 取消订阅从移除的项目中移除的 PropertyChanged 事件,并在清除集合时清除所有项目
    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;
        base.ClearItems();
    }

    // 订阅元素中的 PropertyChanged 事件
    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    // 取消订阅元素中的 PropertyChanged 事件
    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    // 当包含的元素属性更改时发出通知
    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(e);
    }
}</code>
Nach dem Login kopieren

Verwenden Sie diese benutzerdefinierte Sammlung:

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

Hinweise zur Verwendung des PropertyChanged-Ereignisses:

Beachten Sie, dass bei Verwendung des Ereignisses PropertyChanged für eine benutzerdefinierte Sammlung die Sammlung selbst und nicht das geänderte Element der Absender ist. Bei Bedarf können Sie separate ContainerElementChanged-Ereignisse für explizitere Benachrichtigungen definieren.

Das obige ist der detaillierte Inhalt vonGibt es eine Sammlung, die Änderungen sowohl an sich selbst als auch an ihren Elementen überwacht?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage