Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Membuat Pemberitahuan ObservableCollection Apabila Sifat Item Berubah?

Bagaimana untuk Membuat Pemberitahuan ObservableCollection Apabila Sifat Item Berubah?

Barbara Streisand
Lepaskan: 2025-01-04 12:12:35
asal
607 orang telah melayarinya

How to Make ObservableCollection Notify When Item Properties Change?

Beritahu ObservableCollection Apabila Item Berubah

ObservableCollection ialah jenis koleksi berguna yang melaksanakan antara muka INotifyCollectionChanged, yang membolehkan anda mendengar perubahan dalam koleksi . Walau bagaimanapun, ObservableCollection tidak memberitahu tentang perubahan yang dibuat pada sifat item dalam koleksi.

Mengatasi Had

Untuk menangani had ini, anda boleh melaksanakan ObservableCollection tersuai dipanggil TrulyObservableCollection, yang mewarisi daripada ObservableCollection dan mengatasi pengendali acara CollectionChanged untuk melanggan dan nyahlanggan acara PropertyChanged bagi item yang ditambahkan dan dialih keluar daripada koleksi.

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

Penggunaan

Kepada gunakan TrulyObservableCollection, cuma gantikan ObservableCollection dengan TrulyObservableCollection dalam anda kod. Anda perlu melampirkan pengendali pada acara CollectionChanged bagi koleksi untuk mengendalikan perubahan.

MyItemsSource = new TrulyObservableCollection<MyType>();
MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
Salin selepas log masuk

Dalam pengendali acara CollectionChanged, anda boleh melanggan atau menyahlanggan acara PropertyChanged bagi item yang ditambahkan dan dialih keluar daripada koleksi.

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

Alternatif Pendekatan

Walaupun TrulyObservableCollection membenarkan anda memaksa pemberitahuan perubahan koleksi, ini mungkin bukan pendekatan yang paling optimum. Corak yang lebih biasa adalah untuk mengendalikan acara PropertyChanged bagi item individu dalam pengendali CollectionChanged ObservableCollection. Ini memastikan bahawa hanya perubahan sifat tertentu dalam koleksi menyebabkan kemas kini UI, mengoptimumkan prestasi dan menyediakan kawalan yang lebih terperinci.

Atas ialah kandungan terperinci Bagaimana untuk Membuat Pemberitahuan ObservableCollection Apabila Sifat Item Berubah?. 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