11

我有一个(外部)模型公开一个不断变化的列表(比如说每两秒左右)。ViewModel 知道注册 PropertyChange 事件的列表。该 ViewModel 还为 UI 提供了 ObservableCollection 以进行数据绑定。

+-----------------------------------------------+
|                                           View|
| +-----------+                                 |
| |Listbox    |                                 |
| +-----------+                                 |
+-----/\----------------------------------------+
      ||
      ||DataBinding
      ||
      ||
+-----||----------------------------------------+
|     ||                               ViewModel|
| +--------------------+         +-------------+|
| |ObservableCollection|<--------|ChangeHandler||
| +--------------------+    /    +-------------+|
|                          /           ^        |
+-------------------------/------------|--------+
                         /             |
                        /              |
           Synchronizing Lists         | PropertyChanged
                                       |
                                       |
+--------------------------------------|--------+
|                                  +-----+ Model|
|                                  |IList|      |
|                                  +-----+      |
|                                               |
+-----------------------------------------------+

原则上效果很好,除了不断进行的更新。随着每次更新,用户都会失去他的选择,即每次更新都会取消选择所有项目。这并不奇怪,因为 WPF 的 ListBox “看到”分配了一个新列表。

所以,事情一定是我们没有分配新的 ObservableCollection,而是将当前 ObservableCollection 的内容与更新后的 Model.List 合并

现在我的问题

  • 同步列表 - 是否有关于如何进行此类合并的最佳实践(或框架)(将新项目复制到 ObservableCollection、删除丢失的项目、更新更改的项目)
  • 选定项目 - 我如何确保 ListBox 保留当前选定的项目(除了项目被删除的情况)
4

1 回答 1

3

您可以从更新的模型列表中生成新的 ObservableCollection,也可以将当前的 ObservableCollection 与模型的同步。

如果您选择第二个,您可能想要避免的一件事是为每个同步项目触发 CollectionChanged 事件。看一下这个 ObservableCollection 实现,它具有延迟通知的能力。

至于保留当前的 ​​SelectedItem,如果 ObservableCollection 的实例没有更改(这是真的,因为我们正在同步集合)并且 SelectedItem 实例没有被删除,则列表框应该保存选择。但是,如果 NotifyCollectionChangedEventArgs.Action 是“重置”,我不确定这是否属实。如果是这种情况,您可以使用我使用的方法,即在 ViewModel 中同时具有 colllection 属性和 SelectedItem 属性。您在 TwoWay 模式下将 ViewModel 的 SelectedItem 绑定到 ListBox.SelectedItem。同步集合时,将 SelectedItem 保存在临时变量中,然后在同步后重新应用它(如果未删除)。

于 2013-02-26T15:55:37.343 回答