首頁 >後端開發 >C++ >是否存在可追蹤集合和元素屬性變更的 ObservableCollection?

是否存在可追蹤集合和元素屬性變更的 ObservableCollection?

Susan Sarandon
Susan Sarandon原創
2025-01-07 16:36:40824瀏覽

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

監控集合與元素屬性變化的ObservableCollection

問題:

是否存在一種集合能夠同時監控集合本身的變化和其元素的屬性變化?

解:

如果沒有現成的集合滿足此需求,您可以建立一個擴充ObservableCollection的實現,來監控其元素的PropertyChanged事件。

實作:

以下是一個ObservableCollectionEx的範例實現,它實現了這個功能:

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

用法:

像使用普通的ObservableCollection一樣使用ObservableCollectionEx,但將其轉換為INotifyPropertyChanged以訂閱其元素的屬性更改事件:

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

注意: ContainedElementChanged 方法中,OnPropertyChanged 的參數需要是新的 PropertyChangedEventArgs 實例,而不是直接使用 e。 這已經在上文的程式碼中進行了更正。 這確保了正確的屬性名稱被傳遞到事件處理程序。

以上是是否存在可追蹤集合和元素屬性變更的 ObservableCollection?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn