Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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
C# 如何保持不同集合的属性同步?_C#_Wpf_Properties_Synchronization_Observablecollection - Fatal编程技术网

C# 如何保持不同集合的属性同步?

C# 如何保持不同集合的属性同步?,c#,wpf,properties,synchronization,observablecollection,C#,Wpf,Properties,Synchronization,Observablecollection,我有一个WPF应用程序,它的屏幕包含一个带有两个选项卡的选项卡控件。每个选项卡上都有一个数据网格,每个数据网格都绑定到零件对象的可观察集合。零件有一些“数量”特性,需要在轴网之间同步。例如,如果用户更改grid1上partABC的数量,则partABC需要以相同的数量添加到grid2,或者如果grid2已包含partABC,则必须更改其数量以反映grid1 我的问题是,这必须是双向的。如果我在两个网格中的每个部分上都设置一个PropertyChanged处理程序,那么当它们不断更新彼此的数量时,

我有一个WPF应用程序,它的屏幕包含一个带有两个选项卡的选项卡控件。每个选项卡上都有一个数据网格,每个数据网格都绑定到零件对象的可观察集合。零件有一些“数量”特性,需要在轴网之间同步。例如,如果用户更改grid1上partABC的数量,则partABC需要以相同的数量添加到grid2,或者如果grid2已包含partABC,则必须更改其数量以反映grid1

我的问题是,这必须是双向的。如果我在两个网格中的每个部分上都设置一个PropertyChanged处理程序,那么当它们不断更新彼此的数量时,最终会出现一个无限循环。到目前为止,我一直在tab control selection changed事件中处理这个问题,只是在其中一个列表中迭代并逐个设置数量。这已经足够好了,直到我意识到用户可能会将数千个零件添加到他们的列表中,并且在这一点上,这个过程需要花费不可接受的时间来完成(对于4500个零件对象,大约25秒)

编辑

第一个网格包含数据库中的每个零件,就像一个“选择列表”,用户只需滚动到他们要查找的零件并输入数量。第二个网格仅包含用户手动输入的零件,以防用户输入所需零件的编号。Grid2始终是grid1的一个子集。

您可以通过数据绑定来实现这一点。不应创建重复的零件对象。而是复制包含零件的集合

Part sharedPart = new Part();
Part onlyInTabA = new Part();
Part onlyInTabB = new Part();

ObservableCollection<Part> tabAParts = new ObservableCollection<Part>() { sharedPart, onlyinTabA };
ObservableCollection<Part> tabBParts = new ObservableCollection<Part>() { sharedPar, onlyInTabB };
零件共享零件=新零件();
仅零件选项卡A=新零件();
仅零件选项卡B=新零件();
ObservableCollection tabAParts=新的ObservableCollection(){sharedPart,onlyinTabA};
ObservableCollection tabBParts=新的ObservableCollection(){sharedPar,onlyInTabB};
现在使用
tabAParts
将数据绑定到选项卡A上的网格,使用
tabBParts
将数据绑定到选项卡B上的网格


如果您的
零件
类实现了
INotifyPropertyChanged
,则更改
sharedPart的属性将更新两个选项卡上的两个网格。添加新零件时,您可以选择将其共享(将其添加到两个集合中)或使其特定于选项卡

对不起,我刚刚意识到我的问题缺少一些信息。为Clarity编辑了最初的帖子。事实上,我认为这个想法仍然有效,我只需要在需要插入到tabB集合时添加tabA集合中的现有部分。非常好,非常感谢。如果您将新值与现有值进行比较,则不会出现无限循环,如果它们相等,则不会引发属性更改事件。例如,
set{if(value!=\u myproperty){{u myproperty=value;RaisePropertyChanged(()=>myproperty);}}