Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 将模型的更改列表同步到ViewModel的可观察列表的最佳实践?_Wpf_C# 4.0_User Interface_Observablecollection_Synchronizing - Fatal编程技术网

Wpf 将模型的更改列表同步到ViewModel的可观察列表的最佳实践?

Wpf 将模型的更改列表同步到ViewModel的可观察列表的最佳实践?,wpf,c#-4.0,user-interface,observablecollection,synchronizing,Wpf,C# 4.0,User Interface,Observablecollection,Synchronizing,我有一个(外部)模型,它公开了一个不断变化的列表(比如说每两秒钟左右)。 ViewModel知道为PropertyChange事件注册的列表。该ViewModel还为UI提供了用于数据绑定的ObservableCollection +-----------------------------------------------+ | View| | +-----------+

我有一个(外部)模型,它公开了一个不断变化的列表(比如说每两秒钟左右)。 ViewModel知道为PropertyChange事件注册的列表。该ViewModel还为UI提供了用于数据绑定的ObservableCollection

+-----------------------------------------------+
|                                           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的集合中。到目前为止,我发现它非常好用。与我所指的相似