【问题标题】:Refreshing ObservableCollection刷新 ObservableCollection
【发布时间】:2016-09-07 18:52:20
【问题描述】:

我注意到一种情况,如果我使用 RemoveRange 从 ObservableCollection 中删除所有项目,它会更新 UI,但如果至少剩下一个项目,则不会。通过查看 ObservableCollection 源代码 here,我看不出他们正在做什么来刷新内部 Items 集合。我基本上是对 ObservableCollection 进行子类化并实现我自己的 OnCollectionChanged 行为以防止 UI 性能问题并面临这个问题。在这个方向上有什么想法吗?关于如何刷新 observablecollection 的任何指针?

谢谢, 周杰伦

【问题讨论】:

    标签: c# observablecollection


    【解决方案1】:

    当您的 UI 在 OnCollectionChanged 中激活时,您是否在 NotifyCollectionChangedEventArgs 中使用 OldItemsNewItems

    @CarbineCoder 答案链接中的ClearItems 方法或添加/删除范围方法不会使OldItemsNewItems 变为NotifyCollectionChangedEventArgs。 它只有NotifyCollectionChangedAction.Reset

    我认为,如果您的 UI 代码根据 OldItemsNewItems 修改,它在调用 ClearItems 或自定义实现的 Range 方法(如链接中)上不起作用。

    【讨论】:

    • 让我试试这个!
    • 幸好错误:构造函数仅支持“替换”操作。您对 OldItems 和 NewItems 的观察似乎是正确的,但无法为它们提供重置操作。
    【解决方案2】:

    简而言之,Observable 集合触发 NotifyProperty changed 事件,用于对基础集合进行更改。因此,如果您看到您提到的 Observable 集合源代码中可用的公共方法,您将看到 InsertItem、RemoveItem、ClearItems 等的实现。它们调用 OnPropertyChanged(IndexerName);

    RemoveRange 方法而言,它不是由ObservableCollection 实现的,而是由不调用OnPropertyChanged(IndexerName); 的底层List 实现的,因此您不会观察到UI 中的变化。我建议你不要使用remove range,而是遍历item并一个一个地删除它们。

    你可以看到 removerange 的实现 - https://stackoverflow.com/a/670579/442444

    【讨论】:

    • 一一删除或一一添加时会影响性能。它会为绑定的 DataGrid 控件导致 3000 多个 UI 通知并冻结 UI。
    • 查看上面提供的链接,它实现了一个范围内只通知一次。
    • 谢谢。我已经知道那个链接了。我实际上尝试了它并遵循相同的方法,但我仍然没有看到 UI 发生变化。我还显式调用了 Items[] 和 Count 的属性更改。
    猜你喜欢
    • 2012-08-03
    • 2013-04-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2016-06-05
    • 2011-08-11
    • 2021-10-20
    • 2014-02-01
    相关资源
    最近更新 更多