我有一个(外部)模型,它公开了一个不断变化的列表(假设每隔两秒左右)。ViewModel知道注册PropertyChange事件的列表。该ViewModel还为UI提供了用于数据绑定的ObservableCollection。
+-----------------------------------------------+
| View|
| +-----------+ |
| |Listbox | |
| +-----------+ |
+-----/\----------------------------------------+
||
||DataBinding
||
||
+-----||----------------------------------------+
| || ViewModel|
| +--------------------+ +-------------+|
| |ObservableCollection|<--------|ChangeHandler||
| +--------------------+ / +-------------+|
| / ^ |
+-------------------------/------------|--------+
/ |
/ |
Synchronizing Lists | PropertyChanged
|
|
+--------------------------------------|--------+
| +-----+ Model|
| |IList| |
| +-----+ |
| |
+-----------------------------------------------+
原则上,这是很好的工作,除了不断更新。每更新一次,用户就会松开他的选择,也就是说,所有的项目都将随每次更新一起被取消选择。这并不奇怪,因为WPF的ListBox“看到”分配了一个新的列表。
因此,问题是我们不分配新的ObservableCollection,而是将当前ObservableCollection的内容与更新的Model.List合并。
现在我的问题
发布于 2013-02-26 07:55:37
您可以从更新的模型列表中生成一个新的ObservableCollection,也可以将当前的ObservableCollection与模型的ObservableCollection同步。
如果您进行第二步,您可能希望避免的一件事是为每个同步项触发CollectionChanged事件。看看这个ObservableCollection实现,它具有延迟通知的能力。
至于保持当前的SelectedItem,如果ObservableCollection的实例没有被更改(因为我们同步了集合)并且SelectedItem实例没有被删除,那么列表框应该保存所选内容。但是,如果NotifyCollectionChangedEventArgs.Action是“重置”的,我不确定这是否正确。如果是这样的话,您可以使用我使用的方法,即在SelectedItem中有一个排序规则属性和一个ViewModel属性。在SelectedItem模式下将ViewModel的ListBox.SelectedItem绑定到ListBox.SelectedItem。同步集合时,您可以将SelectedItem保存在一个临时变量中,然后在同步之后重新应用它(如果没有删除它)。
https://stackoverflow.com/questions/15092247
复制