【问题标题】:ObservableCollection: raising event when updating valuesObservableCollection:更新值时引发事件
【发布时间】:2014-09-22 15:03:25
【问题描述】:

“在添加、删除、更改、移动或刷新整个列表时发生。”这是在MSDN上写的,讲的是CollectionChanged事件……但是……“改变”是什么意思??

我有一个 observableCollection。它是从 db 填充的,并且在我的视图中绑定(我正在使用 mvvm 模式)。

所以,我认为:“好吧,从我的角度来看,我编辑了我的字段,与 observableCollection 绑定”。通过调试,我看到字段更新了,但是……事件没有被触发……为什么?

msdn 中的“已更改”是什么意思?而且,如果这种方式是错误的,当 observablecollection 的值按照我之前解释的方式更新时,我该如何触发我的操作?

【问题讨论】:

标签: c# wpf events mvvm event-handling


【解决方案1】:

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

【讨论】:

  • 那么,在您看来,我该如何实施这个控制?
  • @PieroAlberto 如果您想知道集合中的对象何时发生变异,您需要将对象放入集合中,以便在发生变异时通知您。 ObservableCollection 不会为你做的。
  • 它是由实体框架edmx类组成的集合..我该怎么做?
  • @PieroAlberto 听起来您只需要花一些时间阅读有关该主题的教程。
  • 我知道...关于这个的任何链接?
【解决方案2】:

您将INotifyCollectionChanged interfaceINotifyPropertyChanged interface 混淆了。听起来您想知道集合中任何项目的任何 property 何时更改。为了实现这一点,您需要在数据类型类中实现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);
}

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多