我有一个(外部)模型公开一个不断变化的列表(假设每两秒左右)。
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/