wpf - 将模型的变化列表同步到 ViewModel 的 ObservableList 的最佳实践?

标签 wpf c#-4.0 user-interface observablecollection synchronization

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

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

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

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

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

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

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

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

    关于wpf - 将模型的变化列表同步到 ViewModel 的 ObservableList 的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15092247/

    相关文章:

    wpf - 在WPF中为ViewModel中的命令分配快捷键

    c# - 通过 C++ 64 位 dll 在 64 位 .net 应用程序中调用 PInvoke

    c# - 如何为所有文本框的特定目的使用通用子?

    c# - 我们如何为窗口创建单例实例?

    Gwt-query 对我的 MVP 不起作用。

    c++ - QTableView 如何突出显示鼠标悬停的整行?

    wpf - 将 View 注入(inject)容器 MVVM WPF

    wpf - 如何从 View 模型(Caliburn+WPF)关闭对话框窗口?

    c# - StackPanel 的方向在 ItemsControl (WPF) 中不起作用

    java - Mac OS X 10.10 (Yosemite) Java Swing 外观和感觉?