将两个可观察集合相互绑定

6

我有两个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 绑定到ComboBox的 ItemsSource 中。

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

刷新绑定后,更改将被正确反映(再次执行上面的代码)。

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

有没有办法实现这一点?


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

1

刚看到一些未回答的旧问题,然后看到这个。毋庸置疑,您现在已经想出了一种解决方法,但我的建议是考虑使用 CLinq、Bindable Linq 或 Obtics 等工具来解决这个问题。有关更多详细信息,请参见 this question。您将采取第一个集合,对其创建动态查询,并将该动态查询(实现 IObservableCollection)公开为第二个属性。


1
有一个很好的叫做OLinq的库可以在Nuget/Github上找到。 - mcintyre321

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接