【问题标题】:WPF DataGrid update on CollectionChanged failsCollectionChanged 上的 WPF DataGrid 更新失败
【发布时间】:2014-10-16 21:16:35
【问题描述】:

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

【问题讨论】:

    标签: wpf datagrid observablecollection inotifycollectionchanged


    【解决方案1】:

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

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

    我在我的应用中遇到了一个特别讨厌的副作用,我在 WPF 中的 ObservableCollection 中显示 EF 实体。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        • 2018-12-03
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多