Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memberitahu Koleksi Perubahan Tahap Item yang Boleh Diperhatikan dengan Cekap?

Bagaimana untuk Memberitahu Koleksi Perubahan Tahap Item yang Boleh Diperhatikan dengan Cekap?

Linda Hamilton
Linda Hamiltonasal
2025-01-05 04:04:39267semak imbas

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

Maklumkan ObservableCollection pada Perubahan Item

Dalam kes di mana item dalam ObservableCollection mengalami perubahan, adalah perlu untuk memberitahu koleksi perubahan ini kepada memastikan kemas kini UI yang betul. Tingkah laku lalai ObservableCollection gagal dalam memerhati perubahan peringkat item, mendorong penerokaan penyelesaian alternatif.

TrulyObservableCollection

Satu pendekatan melibatkan penggunaan kelas TrulyObservableCollection, yang memanjangkan ObservableCollection dan termasuk mekanisme langganan untuk acara PropertyChanged pada itemnya. Ini boleh dilaksanakan seperti berikut:

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

Isu Pelaksanaan

Walau bagaimanapun, menggunakan TrulyObservableCollection mungkin tidak memberikan hasil yang diingini. Untuk memanfaatkan sepenuhnya keupayaannya, kelas MyViewModel mesti mendaftarkan pengendali untuk acara CollectionChanged MyItemsSource:

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

Pendekatan Alternatif: Regular ObservableCollection

Kaedah alternatif ialah untuk menggunakan ObservableCollection standard dan melanggan peringkat item secara manual Acara PropertyChanged dalam pengendali CollectionChanged:

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

Dengan pendekatan ini, kemas kini UI dicetuskan secara khusus apabila MyProperty item berubah, menghapuskan keperluan untuk kemas kini kasar merentas keseluruhan koleksi.

Atas ialah kandungan terperinci Bagaimana untuk Memberitahu Koleksi Perubahan Tahap Item yang Boleh Diperhatikan dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn