Rumah >pembangunan bahagian belakang >C++ >Mengapa ObservableCollection Saya Tidak Memaklumkan tentang Perubahan Item, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa ObservableCollection Saya Tidak Memaklumkan tentang Perubahan Item, dan Bagaimana Saya Boleh Membetulkannya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-04 10:15:34184semak imbas

Why Doesn't My ObservableCollection Notify on Item Changes, and How Can I Fix It?

Mengapa Notify ObservableCollection Tidak Berfungsi dengan Perubahan Item?

Semasa mencari penyelesaian untuk memberitahu ObservableCollection apabila item berubah, anda terjumpa TrulyObservableCollection, iaitu direka untuk menangani isu khusus ini. Walau bagaimanapun, selepas melaksanakan kelas ini dalam projek anda, anda menyedari bahawa pemberitahuan koleksi tidak dicetuskan.

Setelah menyiasat, ternyata punca masalah terletak pada sifat MyItemsSource dalam kelas MyViewModel anda. Walaupun anda telah melaksanakan antara muka INotifyPropertyChanged, anda tidak memasukkan kod yang diperlukan untuk mencetuskan peristiwa perubahan sifat. Khususnya, anda kehilangan kod yang akan memanggil RaisePropertyChangedEvent("MyItemsSource") apabila koleksi ditukar.

Untuk menyelesaikan isu ini, anda boleh menambah baris berikut pada penetap sifat MyItemsSource:

private TrulyObservableCollection<MyType> myItemsSource;
public TrulyObservableCollection<MyType> MyItemsSource
{
    get { return myItemsSource; }
    set 
    { 
        myItemsSource = value; 
        // Code to trig on item change...
        RaisePropertyChangedEvent("MyItemsSource");
    }
}

Walau bagaimanapun, pendekatan ini tidak disyorkan kerana ia akan mencetuskan peristiwa penukaran harta apabila koleksi ditukar, tidak kira sama ada ia disebabkan oleh perubahan item atau perubahan lain.

Pendekatan alternatif dan lebih cekap ialah menggunakan acara CollectionChanged dari TrulyObservableCollection untuk mendaftarkan pengendali untuk acara PropertyChanged bagi setiap item dalam koleksi . Dengan cara ini, anda boleh mengendalikan perubahan sifat secara terpilih untuk item individu dan bukannya mencetuskan tetapan semula untuk keseluruhan koleksi.

Coretan kod berikut menggambarkan pendekatan ini:

public MyViewModel()
{
    MyItemsSource = new TrulyObservableCollection<MyType>();
    MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;

    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)
{
    // Handle here
}

Atas ialah kandungan terperinci Mengapa ObservableCollection Saya Tidak Memaklumkan tentang Perubahan Item, dan Bagaimana Saya Boleh Membetulkannya?. 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