Wpf 将模型的更改列表同步到ViewModel的可观察列表的最佳实践?
我有一个(外部)模型,它公开了一个不断变化的列表(比如说每两秒钟左右)。 ViewModel知道为PropertyChange事件注册的列表。该ViewModel还为UI提供了用于数据绑定的ObservableCollectionWpf 将模型的更改列表同步到ViewModel的可观察列表的最佳实践?,wpf,c#-4.0,user-interface,observablecollection,synchronizing,Wpf,C# 4.0,User Interface,Observablecollection,Synchronizing,我有一个(外部)模型,它公开了一个不断变化的列表(比如说每两秒钟左右)。 ViewModel知道为PropertyChange事件注册的列表。该ViewModel还为UI提供了用于数据绑定的ObservableCollection +-----------------------------------------------+ | View| | +-----------+
+-----------------------------------------------+
| View|
| +-----------+ |
| |Listbox | |
| +-----------+ |
+-----/\----------------------------------------+
||
||DataBinding
||
||
+-----||----------------------------------------+
| || ViewModel|
| +--------------------+ +-------------+|
| |ObservableCollection|<--------|ChangeHandler||
| +--------------------+ / +-------------+|
| / ^ |
+-------------------------/------------|--------+
/ |
/ |
Synchronizing Lists | PropertyChanged
|
|
+--------------------------------------|--------+
| +-----+ Model|
| |IList| |
| +-----+ |
| |
+-----------------------------------------------+
+-----------------------------------------------+
|看法|
| +-----------+ |
||列表框||
| +-----------+ |
+-----/\----------------------------------------+
||
||数据绑定
||
||
+-----||----------------------------------------+
|| |视图模型|
| +--------------------+ +-------------+|
|| ObservableCollection |您可以从更新的模型列表生成新的ObservableCollection,也可以将当前ObservableCollection与模型的ObservableCollection同步
如果您选择第二种方式,您可能希望避免的一件事是为每个同步的项目触发CollectionChanged事件。看看哪一个具有延迟通知的能力
至于保留当前SelectedItem,如果ObservaleCollection的实例没有更改(这是真的,因为我们正在同步集合),并且SelectedItem实例没有被删除,则列表框应该保存选择。但是,如果NotifyCollectionChangedEventArgs.Action是“Reset”,我不确定这是否正确。如果是这种情况,您可以使用我使用的方法,即在ViewModel中同时具有collection属性和SelectedItem属性。以双向模式将ViewModel的SelectedItem绑定到ListBox.SelectedItem。同步集合时,将SelectedItem保存在临时变量中,然后在同步后重新应用它(如果未删除)。谢谢。我是一个非常直观的人,需要一些图片。很快就搞定Jave5好的,谢谢你。你证实了我最糟糕的想象。没有自动合并(提供我自己的比较器)。因此,是时候编写我自己的带有延迟事件引发的MergeableCollection了;-)我目前正在开发一种解决方案,类似于您对集合所做的工作,我一直在使用AutoMapper在域模型和视图模型之间进行映射。如果这样做,您可以编写一个合并转换器,该转换器将自动将集合中的传入模型合并到ViewModel的集合中。到目前为止,我发现它非常好用。与我所指的相似