首頁 > 後端開發 > C++ > 如何讓 ObservableCollection 在項屬性變更時發出通知?

如何讓 ObservableCollection 在項屬性變更時發出通知?

Barbara Streisand
發布: 2025-01-04 12:12:35
原創
607 人瀏覽過

How to Make ObservableCollection Notify When Item Properties Change?

當專案更改時通知ObservableCollection

ObservableCollection 是一個方便的集合類型,它實現了INotifyCollectionChanged 集合中允許您監聽介面的更改。但是,ObservableCollection 不會通知對集合中項目的屬性所做的變更。

克服限制

要解決此限制,您可以實作自訂ObservableCollection稱為TrulyObservableCollection,它繼承自ObservableCollection並重寫CollectionChanged事件處理程序來訂閱和取消訂閱新增至集合中和從集合中刪除的項目的PropertyChanged 事件。

TrulyObservableCollection

public class TrulyObservableCollection<T> : ObservableCollection<T>
where T : INotifyPropertyChanged
{
    public TrulyObservableCollection()
        : base()
    {
        CollectionChanged += TrulyObservableCollection_CollectionChanged;
    }

    void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        OnCollectionChanged(a);
    }
}
登入後複製

用法

使用TrulyObserv.您需要將處理程序附加到集合的 CollectionChanged 事件來處理變更。

MyItemsSource = new TrulyObservableCollection<MyType>();
MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
登入後複製

在 CollectionChanged 事件處理程序中,您可以訂閱或取消訂閱從集合中新增和刪除的項目的 PropertyChanged 事件。

void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null)
        foreach (MyType item in e.NewItems)
            item.PropertyChanged += new PropertyChangedEventHandler(MyType_PropertyChanged);

    if (e.OldItems != null)
        foreach (MyType item in e.OldItems)
            item.PropertyChanged -= new PropertyChangedEventHandler(MyType_PropertyChanged);
}
登入後複製

替代方案方法

雖然 TrulyObservableCollection 允許您強制收集更改通知,但它可能不是最佳方法。較常見的模式是在 ObservableCollection 的 CollectionChanged 處理程序中處理單一項目的 PropertyChanged 事件。這可確保只有集合中的特定屬性變更才會導致 UI 更新,從而最佳化效能並提供更精細的控制。

以上是如何讓 ObservableCollection 在項屬性變更時發出通知?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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