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