LINQ和Static ObservableCollection

时间:2011-11-07 14:38:46

标签: vb.net linq observablecollection

这可能是LINQ& amp;的基本问题。然而,在尝试更新静态ObservableCollection时,我无法理解我所遇到的问题。

 Me.Grid1.ItemsSource = ContactList

 Me.Grid2.ItemsSource = From s In ContactList Where s.ContactTypes.Any(Function(t) t.ContactTypeName = "Christmas List")

如果我使用 ContactType "圣诞节列表"添加新联系对于 ContactList ObservableCollection,Grid1反映了额外的联系人,但Grid2不反映更改,除非我重新绑定。

无论如何要反映Grid2中的更改以显示新的联系人以及查询的 ContactType

3 个答案:

答案 0 :(得分:1)

由于LINQ查询的延迟执行性质,可能会发生这种情况。仅当您开始枚举结果集时才会获取值。这就是为什么,您必须重新绑定数据源,才能看到更改。尝试在查询结尾添加ToList()方法。例如,

Me.Grid2.ItemsSource = From s In ContactList Where s.ContactTypes.Any(Function(t) t.ContactTypeName = "Christmas List").ToList();

答案 1 :(得分:1)

Grid2实际上绑定到IEnumerable(Of Contact)而不是Observable Collection。这就是为什么改变没有反映在Grid2中。您需要使用事件或INotifyPropertyChanged重新执行Linq查询。

答案 2 :(得分:0)

您需要我的ObservableComputations库。使用该库,您可以像这样进行编码:

Me.Grid2.ItemsSource = ContactList.Filtering(c => c.ContactTypes.ContainsComputing("Christmas List").Value); 

过滤扩展方法返回ObservableCollection的实例,并反映ContactList集合和ContactTypes集合中的所有更改。编写上面的代码,我假设contactContactTypes id为ObservableCollection。如果不是这样,则可以编写代码:

Me.Grid2.ItemsSource = ContactList.Filtering(c => c.ContactTypes.Contains("Christmas List")); 
 

在这种情况下,请不要忘记将INotifyPropertyChanged接口的实现添加到Contact类,以使结果ObservableCollection反映contact.ContactTypes属性的更改。