Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memberitahu Koleksi Perubahan Tahap Item yang Boleh Diperhatikan dengan Cekap?
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!