【问题标题】:Updating ObservableCollections in WPF MVVM Applications更新 WPF MVVM 应用程序中的 ObservableCollections
【发布时间】:2012-02-29 21:41:07
【问题描述】:

我正在尝试实现“消息/cmets”显示。

视图由绑定到​​ ObservableCollection 的 ListBox 组成(这些是帖子)。我也是双向绑定 ListBox 的 SelectedItem。

当前所选帖子的回复也存储在另一个 ObservableCollection 中。此集合中的每个项目都应插入到 Posts 集合中,紧跟在所选消息之后。

属性中的所有内容都可以正常更新。当这些列表被渲染时,粪便就会击中风扇。

每次选择新帖子时,我都必须执行“.Insert()”而不是“.Add()”。即使在处理数千个帖子和数百个 cmets 时,这也会造成显着的 [不可接受的] 性能损失。

我想这样做:'PostsCollection = newObservableCollectionWithPostsAndComments',但这会导致整个列表框刷新并且 SelectedItem 变为未选中状态。

您应该如何处理将项目动态插入到绑定到 ListBox 的 ObservableCollection 中而不重新绘制 Listbox?

*除了正在显示的新项目

编辑:我有一种轻微的感觉,我犯了一个编码错误,但我不能在这里显示所有的源代码。如果你能告诉我我想要的是否可能,那就太好了。

【问题讨论】:

  • 如果您发布一个示例测试代码来复制您所面临的问题,将会很有帮助
  • 当您使用ICollectionView 并绑定到它,然后降序排序时会发生什么?

标签: wpf observablecollection


【解决方案1】:

如果我正确理解您的问题,您在 Observable 集合中插入项目时遇到问题。实际上,在每次插入后,集合都会调用集合更改事件并重新绘制 UI。

解决此问题的一种方法是从 Observable 集合派生一个新类,例如 ObservableCollectionEx 使用 AddRange(IEnumerable items) 之类的方法,您将在其中将多个项目添加到集合中,但仅引发一个集合更改事件。示例在下面的链接中

http://xcalibursystems.com/2013/12/making-a-better-observablecollection-part-1-extensions/

另一种方法,也许不是一个干净的方法,是使用结果项集创建新的 ObservableCollection,并将其分配给 ListBox 的 ItemsSource 绑定的属性。如果您实现 INotifyPropertyChanged,也不要忘记为该属性引发 PropertyChanged 事件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多