"在添加,删除,更改,移动项目或刷新整个列表时发生。"这是用MSDN编写的,谈论CollectionChanged事件......但是......用"改变" ??
是什么意思我有一个observableCollection。它是从db填充的,它在我看来是绑定的(我使用的是mvvm模式)。
所以,我认为:"好吧,从我的观点来看,我编辑了我的字段,与observableCollection"绑定。通过调试,我看到字段已更新,但是...事件未被触发......为什么?
msdn对"改变了什么意味着"?并且,如果这种方式错了,当我按照我之前解释的方式更新observablecollection的值时,如何触发我的操作?
答案 0 :(得分:1)
在此上下文中,更改意味着将某个索引处的项目替换为另一个项目,而不是改变现有项目。变异集合中的项目不是集合的变化,也不是在一般情况下观察这些变化的方法。
答案 1 :(得分:0)
您将INotifyCollectionChanged
interface与INotifyPropertyChanged
interface混淆了。听起来你想知道集合中任何项目的任何属性何时发生变化。为了实现这一点,您需要在数据类型类中实现INotifyPropertyChanged
接口并将处理程序附加到INotifyPropertyChanged.PropertyChanged
事件:
item.PropertyChanged += Item_PropertyChanged;
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// The 'e.PropertyName' property changed
}
您可以通过扩展ObservableCollection<YourDataType>
类并将此代码添加到该类中来进一步改进:
public new void Add(T item)
{
item.PropertyChanged += Item_PropertyChanged;
base.Add(item);
}
...
public new bool Remove(T item)
{
if (item == null) return false;
item.PropertyChanged -= Item_PropertyChanged;
return base.Remove(item);
}
还有其他一些方法你应该以这种方式覆盖,但是一旦你有了,你可以让这个类为你完成所有的工作...如果你把它放到某种通用基类中会更好。如果您使该类也实现了INotifyPropertyChanged
接口,那么您也可以为了方便而“转发”所有属性更改:
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
NotifyPropertyChanged(e.PropertyName);
}