0

我已将 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?

4

2 回答 2

1

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

于 2014-08-23T23:22:40.330 回答
0

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

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

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

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

于 2014-08-24T06:39:15.350 回答