CollectionChanged上的WPF DataGrid更新失败

时间:2014-08-22 23:12:54

标签: wpf datagrid observablecollection inotifycollectionchanged

我已将DataGrid绑定到类型为TEntity的ObservableCollection。 该集合包含实体框架实体。

当这样的实体在数据库中发生变化时,应用程序会收到通知。如果它是一个简单的替换更改,我只需覆盖ObservableCollection中的实体。

但是,这不会触发UI刷新。我认为问题在于它仍然是我指的同一个对象。现在,实体与UI显示的内容完全不同(我在DbContext上重新加载),因为某些列已经更改。

当我这样做时

collection[index] = changedObject;

什么都没发生。该集合正确触发CollectionChanged事件,但UI不会更新任何内容。

然后我尝试了这个:

collection[index] = new TEntity();  // Create a dummy object
collection[index] = changedObject;

现在UI更新,但当然集合会触发2个CollectionChanged事件。

我想一个选项是为已更改实体的所有属性触发PropertyChanged事件,但这似乎有点过分(太多事件),到目前为止我还没有必要在我的EF上实现该事件类。

我的问题: 如果行已更改但对象仍然相同(尽管对象中的属性已更改),如何可靠地更新WPF绑定的ObservableCollection?

2 个答案:

答案 0 :(得分:1)

您必须对每个属性使用PropertyChanged,或者使用一个PropertyChanged事件来指示对象的所有属性都已更改,方法是使用null或String.Empty作为PropertyChangedEventArgs中的属性名称。 Documentation

答案 1 :(得分:0)

只是想在Chris Laffey的答案中添加一些额外的信息,这是正确答案。

进一步阅读显示,如果旧对象和新对象相同,则WPF将不会处理Replace操作的CollectionChanged事件。

我的应用程序中有一个特别讨厌的副作用,我在WPF的ObservableCollection中显示EF实体。

我正在监控数据库的变化。当表行被修改时,实体从DbContext重新加载。由于ObservableCollection使用相同的EF实体对象(在相同的内存位置),因此导致覆盖了PropertChanged事件,当重新加载实体时,该事件显然会被重置。