Sev*_*ven 9 wpf user-interface synchronizing observablecollection c#-4.0
我有一个(外部)模型暴露一个不断变化的List(假设每两秒左右).ViewModel知道该列表注册了PropertyChange事件.ViewModel还为UI提供了一个ObservableCollection以进行数据绑定.
+-----------------------------------------------+
| View|
| +-----------+ |
| |Listbox | |
| +-----------+ |
+-----/\----------------------------------------+
||
||DataBinding
||
||
+-----||----------------------------------------+
| || ViewModel|
| +--------------------+ +-------------+|
| |ObservableCollection|<--------|ChangeHandler||
| +--------------------+ / +-------------+|
| / ^ |
+-------------------------/------------|--------+
/ |
/ |
Synchronizing Lists | PropertyChanged
|
|
+--------------------------------------|--------+
| +-----+ Model|
| |IList| |
| +-----+ |
| |
+-----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
除了不断进行的更新之外,原则上它运作良好.每次更新时,用户都会放弃他的选择,即每次更新都会取消选择所有项目.这也就不足为奇了,因为WPF的ListBox"看到"分配了一个新列表.
所以,事情必须是我们不分配新的ObservableCollection,而是将当前ObservableCollection的内容与更新的Model.List合并.
现在我的问题
您可以从更新的模型列表中生成新的 ObservableCollection,也可以将当前的 ObservableCollection 与模型的 ObservableCollection 同步。
如果您选择第二种,您可能需要避免的一件事是为每个同步项目触发 CollectionChanged 事件。看一下这个 ObservableCollection 实现,它能够推迟通知。
至于保留当前的 SelectedItem,如果 ObservableCollection 的实例未更改(这是真的,因为我们正在同步集合)并且 SelectedItem 实例未删除,则列表框应保留选择。但是,如果 NotifyCollectionChangedEventArgs.Action 为“重置”,我不确定这是否属实。如果是这种情况,您可以使用我使用的方法,即在 ViewModel 中同时具有集合属性和 SelectedItem 属性。您可以在 TwoWay 模式下将 ViewModel 的 SelectedItem 绑定到 ListBox.SelectedItem。同步集合时,您将 SelectedItem 保存在临时变量中,然后在同步后重新应用它(如果未删除)。
| 归档时间: |
|
| 查看次数: |
2752 次 |
| 最近记录: |