LINQ和静态ObservableCollection

问题描述 投票:3回答:3

这可能是LINQ和体系结构专家的基本问题,但是我无法理解尝试更新'Static ObservableCollection时遇到的问题。

 Me.Grid1.ItemsSource = ContactList

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

如果我将带有ContactType“圣诞节列表”的新Contact添加到ContactList ObservableCollection,则Grid1会反映其他联系人,但是Grid2不会反映change,除非我重新绑定。

无论如何反映Grid2中的更改以显示带有查询的ContactType的新Contact

vb.net linq observablecollection
3个回答
1
投票

Grid2实际上是绑定到IEnumerable(Of Contact)而不是Observable集合。这就是为什么更改未反映在Grid2中的原因。您需要使用事件或INotifyPropertyChanged使您的Linq查询重新执行。


1
投票

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

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

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属性的更改。

© www.soinside.com 2019 - 2024. All rights reserved.