首頁 > 後端開發 > C++ > 如何建立一個 ObservableCollection 來監視其元素屬性的變化?

如何建立一個 ObservableCollection 來監視其元素屬性的變化?

Linda Hamilton
發布: 2025-01-07 16:37:46
原創
687 人瀏覽過

How Can I Create an ObservableCollection That Monitors Changes in its Element Properties?

監控元素變化的 ObservableCollection

問題陳述

設想一個 ObservableCollection,其中元素實作 INotifyPropertyChanged,並且集合本身會監控這些元素的任何變更。儘管存在 ObservableCollection,但尚不清楚是否有預先存在的集合滿足此確切要求。

ObservableCollectionEx 類別

建議的解決方案引入了 ObservableCollectionEx,它是 ObservableCollection 的擴展。在此實作中:

  • OnCollectionChanged:更新已新增或刪除項目的事件訂閱。
  • ClearItems:在清除之前取消訂閱元素的屬性變更。
  • Subscribe:訂閱新新增項目的屬性變更。
  • Unsubscribe:取消訂閱已刪除項目的屬性變更。
  • ContainedElementChanged:將元素的屬性變更傳播到集合。

用法

ObservableCollectionEx 的使用方法如下:

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

注意事項

雖然此實作會在元素屬性變更時觸發集合的 PropertyChanged 事件,但這可能會造成混淆。因此,可以引入一個專門用於此類變更的附加事件。

此外,BCL 中的 ObservableCollection 實作僅明確公開 INotifyPropertyChanged 介面。訂閱事件需要強制轉換,如下所示:

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

要注意的是,取消訂閱 PropertyChanged 需要將事件處理程序設定為 null:

<code class="language-csharp">collection.PropertyChanged -= (s, e) => { Trace.WriteLine("Changed " + e.PropertyName); };</code>
登入後複製

以上是如何建立一個 ObservableCollection 來監視其元素屬性的變化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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