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
Lepaskan: 2025-01-05 04:04:39
asal
300 orang telah melayarinya

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);
    }
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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();
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan