【问题标题】:Binding two Observable Collections with each other相互绑定两个 Observable 集合
【发布时间】:2011-05-07 18:55:09
【问题描述】:

我有两个ObservableCollection<string> 类型的属性(在不同的项目中);我想要做的是像这样使用反射和SetBinding 绑定这两者 -

//Get the PropertyDescriptor for first collection property
PropertyDescriptor relatedPropertyDesc = prop.Find(firstCollPropName, false);
Binding relatedPropBinding = new Binding(relatedPropertyDesc.Name);
relatedPropBinding.Source = this.SelectedItem;
relatedPropBinding.Mode = BindingMode.TwoWay;
//Bind the second collection property using binding created above
propItem.SetBinding(MyItem.SecondCollProperty, relatedPropBinding);

SecondCollProperty 然后绑定到组合框的ItemsSource

这样可以正常工作,firstCollProperty 中的值在组合框中正确显示;但如果在运行时对 firstCollProperty 进行了一些更改,则它们不会反映在 ComboBox 中!(添加新项目或创建新集合对象)。

刷新绑定后更改会正确反映(再次执行上述代码)。

我的问题是 - 如果两个 ObservableCollections 绑定在一起,为什么第一个的任何更改都不会反映在其他的?但同样的事情适用于字符串或双精度类型的属性。

有什么方法可以实现吗?

【问题讨论】:

  • 有什么想法吗?如果我的问题不清楚或没有意义,请告诉我?
  • 你的问题有点奇怪,因为我看不出有什么理由绑定两个集合。为什么不在两个地方使用同一个集合?
  • @robertos:谢谢你的提问,我的场景由一个属性网格(PG)和一个设计器(单独的项目)组成,在设计器中我有一个对象,其属性需要在 PG 中显示;该对象的一个​​(或多个)属性属于集合类型,PG 将通过反射获取该属性并将其绑定到集合类型的本地属性(存在于特定属性 Item 中)。由于 PG 仅具有此属性的名称(可能会有所不同),因此它需要另一个集合类型的本地属性来进行绑定。
  • 虽然我会尝试获取PG中的属性值并直接绑定;感谢您指出这一点。

标签: wpf silverlight data-binding reflection observablecollection


【解决方案1】:

刚刚经历了一些未解决的旧问题并看到了这一点。毫无疑问,您现在已经想出了一个解决方法,但我的建议是为此研究 CLinq、Bindable Linq 或 Obtics 之类的东西。有关详细信息,请参阅this question。您将获取第一个集合,针对它创建一个动态查询,并将该动态查询(实现 IObservableCollection)公开为您的第二个属性。

【讨论】:

  • 在 Nuget/Github 上有一个很好的叫做 OLinq 的工具
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 2017-07-23
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多