首頁 > 後端開發 > C++ > 是否存在一個集合可以監控其自身及其元素的變化?

是否存在一個集合可以監控其自身及其元素的變化?

DDD
發布: 2025-01-07 16:27:41
原創
905 人瀏覽過

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

監控元素變化的集合

本文探討了監控集合本身以及集合元素變化的概念。通常,ObservableCollection 會通知集合本身的變化,但不會通知其元素的變化。

是否存在現有能夠監控元素變化的集合?

是的,您可以建立一個自訂實作來擴充 ObservableCollection 以滿足此要求。

具有元素監控功能的自訂 ObservableCollection:

這是一個修改後的 ObservableCollection 版本:

<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>
登入後複製

使用此自訂集合:

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
登入後複製

使用 PropertyChanged 事件時的注意事項:

請注意,當在自訂集合上使用 PropertyChanged 事件時,發送者將是集合本身,而不是發生變更的元素。如有必要,您可以為更明確的通知定義單獨的 ContainerElementChanged 事件。

以上是是否存在一個集合可以監控其自身及其元素的變化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板