首頁 >後端開發 >C++ >如何有效通知 ObservableCollection 專案層級的變更?

如何有效通知 ObservableCollection 專案層級的變更?

Linda Hamilton
Linda Hamilton原創
2025-01-05 04:04:39260瀏覽

How to Efficiently Notify an ObservableCollection of Item-Level Changes?

通知 ObservableCollection 項目更改

如果 ObservableCollection 中的項目發生更改,則有必要將這些更改通知集合確保正確的 UI 更新。 ObservableCollection 的預設行為在觀察專案層級變化方面存在不足,促使人們探索替代解決方案。

TrulyObservableCollection

一種方法涉及利用 TrulyObservableCollection 類,該類擴展ObservableCollection 並包含其項目上的 PropertyChanged 事件的訂閱機制。這可以如下實現:

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);
    }
}

實作問題

但是,使用 TrulyObservableCollection 可能不會產生預期的結果。要充分利用其功能,MyViewModel 類別必須為MyItemsSource 的CollectionChanged 事件註冊一個處理程序:

public MyViewModel()
{
    MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
}

替代方法:常規ObservableCollection

public MyViewModel()
{
    MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
    
    // Add items to the collection
    MyItemsSource.Add(new MyType() { MyProperty = false });
    MyItemsSource.Add(new MyType() { MyProperty = true});
    MyItemsSource.Add(new MyType() { MyProperty = false });
}

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

    if (e.OldItems != null)
        foreach(MyType item in e.OldItems)
            item.PropertyChanged -= MyType_PropertyChanged;
}

void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "MyProperty")
        DoWork();
}

透過這種方法,當專案的 MyProperty 變更時會專門觸發 UI 更新,從而無需對整個集合進行粗略更新。

以上是如何有效通知 ObservableCollection 專案層級的變更?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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