首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将模型的更改列表同步到ViewModel的ViewModel的最佳实践?

将模型的更改列表同步到ViewModel的ViewModel的最佳实践?
EN

Stack Overflow用户
提问于 2013-02-26 14:58:04
回答 1查看 3.7K关注 0票数 11

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

代码语言:javascript
运行
复制
+-----------------------------------------------+
|                                           View|
| +-----------+                                 |
| |Listbox    |                                 |
| +-----------+                                 |
+-----/\----------------------------------------+
      ||
      ||DataBinding
      ||
      ||
+-----||----------------------------------------+
|     ||                               ViewModel|
| +--------------------+         +-------------+|
| |ObservableCollection|<--------|ChangeHandler||
| +--------------------+    /    +-------------+|
|                          /           ^        |
+-------------------------/------------|--------+
                         /             |
                        /              |
           Synchronizing Lists         | PropertyChanged
                                       |
                                       |
+--------------------------------------|--------+
|                                  +-----+ Model|
|                                  |IList|      |
|                                  +-----+      |
|                                               |
+-----------------------------------------------+

原则上,这是很好的工作,除了不断更新。每更新一次,用户就会松开他的选择,也就是说,所有的项目都将随每次更新一起被取消选择。这并不奇怪,因为WPF的ListBox“看到”分配了一个新的列表。

因此,问题是我们不分配新的ObservableCollection,而是将当前ObservableCollection的内容与更新的Model.List合并。

现在我的问题

  • 同步列表-在如何进行这样的合并(将新项复制到ObservableCollection、删除缺失项、更新更改的项)方面是否存在最佳实践(或框架)?
  • 选择的项-如何确保ListBox保留当前选定的项(除了该项已被删除的情况)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-26 15:55:37

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

如果您进行第二步,您可能希望避免的一件事是为每个同步项触发CollectionChanged事件。看看这个ObservableCollection实现,它具有延迟通知的能力。

至于保持当前的SelectedItem,如果ObservableCollection的实例没有被更改(因为我们同步了集合)并且SelectedItem实例没有被删除,那么列表框应该保存所选内容。但是,如果NotifyCollectionChangedEventArgs.Action是“重置”的,我不确定这是否正确。如果是这样的话,您可以使用我使用的方法,即在SelectedItem中有一个排序规则属性和一个ViewModel属性。在SelectedItem模式下将ViewModel的ListBox.SelectedItem绑定到ListBox.SelectedItem。同步集合时,您可以将SelectedItem保存在一个临时变量中,然后在同步之后重新应用它(如果没有删除它)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15092247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档