在寻找项目更改时通知 ObservableCollection 的解决方案时,您偶然发现了 TrulyObservableCollection,它是旨在解决这个特定问题。但是,在项目中实现此类后,您意识到集合通知没有被触发。
经过调查,很明显问题的根源在于 MyViewModel 类中的 MyItemsSource 属性。虽然您已实现 INotifyPropertyChanged 接口,但尚未包含触发属性更改事件所需的代码。具体来说,您缺少在集合更改时调用 RaisePropertyChangedEvent("MyItemsSource") 的代码。
要解决此问题,您可以将以下行添加到 MyItemsSource 属性的设置器中:
private TrulyObservableCollection<MyType> myItemsSource; public TrulyObservableCollection<MyType> MyItemsSource { get { return myItemsSource; } set { myItemsSource = value; // Code to trig on item change... RaisePropertyChangedEvent("MyItemsSource"); } }
但是,不建议使用这种方法,因为每当集合更改时,无论是否是由于项目更改,它都会触发属性更改事件或其他一些更改。
另一种更有效的方法是使用 TrulyObservableCollection 的 CollectionChanged 事件为集合中每个项目的 PropertyChanged 事件注册处理程序。这样,您可以有选择地处理单个项目的属性更改,而不是触发整个集合的重置。
以下代码片段说明了这种方法:
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 }
以上是为什么我的 ObservableCollection 不通知项目更改,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!