ObservableCollection:更新值时引发事件

时间:2014-09-22 15:03:25

标签: c# wpf events mvvm event-handling

"在添加,删除,更改,移动项目或刷新整个列表时发生。"这是用MSDN编写的,谈论CollectionChanged事件......但是......用"改变" ??

是什么意思

我有一个observableCollection。它是从db填充的,它在我看来是绑定的(我使用的是mvvm模式)。

所以,我认为:"好吧,从我的观点来看,我编辑了我的字段,与observableCollection"绑定。通过调试,我看到字段已更新,但是...事件未被触发......为什么?

msdn对"改变了什么意味着"?并且,如果这种方式错了,当我按照我之前解释的方式更新observablecollection的值时,如何触发我的操作?

2 个答案:

答案 0 :(得分:1)

在此上下文中,更改意味着将某个索引处的项目替换为另一个项目,而不是改变现有项目。变异集合中的项目不是集合的变化,也不是在一般情况下观察这些变化的方法。

答案 1 :(得分:0)

您将INotifyCollectionChanged interfaceINotifyPropertyChanged 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);
}