我有一个(外部)模型公开一个不断变化的List(让我们说每两秒左右)。 ViewModel知道该列表注册了PropertyChange事件。 ViewModel还为UI提供了一个ObservableCollection以进行数据绑定。
+-----------------------------------------------+
| View|
| +-----------+ |
| |Listbox | |
| +-----------+ |
+-----/\----------------------------------------+
||
||DataBinding
||
||
+-----||----------------------------------------+
| || ViewModel|
| +--------------------+ +-------------+|
| |ObservableCollection|<--------|ChangeHandler||
| +--------------------+ / +-------------+|
| / ^ |
+-------------------------/------------|--------+
/ |
/ |
Synchronizing Lists | PropertyChanged
|
|
+--------------------------------------|--------+
| +-----+ Model|
| |IList| |
| +-----+ |
| |
+-----------------------------------------------+
除了不断进行的更新外,原则上运作良好。每次更新时,用户都会失去他的选择,即每次更新都会取消选择所有项目。 这也就不足为奇了,因为WPF的ListBox“看到”分配了一个新列表。
所以,事情必须是我们不分配一个新的ObservableCollection,但将当前ObservableCollection的内容与更新的Model.List合并
现在我的问题
答案 0 :(得分:2)
您可以从更新的模型列表生成新的ObservableCollection,也可以将当前的ObservableCollection与模型的同步。
如果你选择第二个,你可能要避免的一件事是为每个同步的项目触发CollectionChanged事件。看一下那些无法推迟通知的this ObservableCollection implementation。
至于保留当前的SelectedItem,如果未更改ObservableCollection的实例(这是真的,因为我们正在同步集合)并且未删除SelectedItem实例,则列表框应保留选择。但是,如果NotifyCollectionChangedEventArgs.Action为“Reset”,我不确定是否属实。如果是这种情况,您可以使用我使用的方法,即在ViewModel中同时具有colllection属性和SelectedItem属性。您将ViewModel的SelectedItem绑定到TwoWay模式下的ListBox.SelectedItem。同步集合时,将SelectedItem保存在临时变量中,然后在同步后重新应用它(如果未删除)。