这可能是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
答案 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属性的更改。