【问题标题】:How to keep properties of separate collections in sync?如何保持单独集合的属性同步?
【发布时间】:2011-09-21 15:10:59
【问题描述】:

我有一个 WPF 应用程序,其屏幕包含一个带有两个选项卡的选项卡控件。每个选项卡上都有一个数据网格,每个都绑定到 Part 对象的 ObservableCollection。该零件有一些“数量”属性,需要在网格之间进行同步。例如,如果用户更改了grid1上partABC的数量,partABC要么需要以相同的数量添加到grid2中,要么如果grid2已经包含partABC,则必须更改其数量以反映grid1。

我的问题是这必须双向工作。如果我在两个网格中的每个部分都设置一个 PropertyChanged 处理程序,我最终会出现一个无限循环,因为它们会不断更新彼此的数量。到目前为止,我在选项卡控件选择更改事件期间处理此问题,只是遍历其中一个列表并一一设置数量。这工作得很好,直到我意识到用户可能会在他们的列表中添加数千个部件,而此时此过程需要花费不可接受的时间才能完成(4500 个部件对象大约需要 25 秒)。

编辑
第一个网格包含数据库中的每个部分,作为一种“选择列表”,用户只需滚动到他们正在寻找的部分并输入数量即可。第二个网格仅包含用户手动输入的零件,以防他们更喜欢输入所需零件的编号。 Grid2 始终是 grid1 的子集。

【问题讨论】:

  • 如果您将新值与现有值进行比较,并且如果它们相等则不引发属性更改事件,则不会出现无限循环。例如,set { if(value != _myproperty){_myproperty=value; RaisePropertyChanged(()=>MyProperty);}}

标签: c# wpf properties synchronization observablecollection


【解决方案1】:

您可以通过数据绑定来完成此操作。您不应创建重复的 Part 对象。而是复制包含部件的集合。

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 };

现在使用 tabAParts 将数据绑定到选项卡 A 上的网格,并使用 tabBParts 将数据绑定到选项卡 B 上的网格

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

【讨论】:

  • 抱歉,我刚刚意识到我的问题缺少一些信息。为 clairty 编辑了初始帖子。
  • 其实我想这个想法还是行得通的,只要我需要插入到 tabB 集合中,我只需要从 tabA 集合中添加现有的部分。太好了,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多