我的wpf应用程序中有一个ListView和ObservableCollection。 我想将linq表达式绑定到ListView:
lv_Results.DataContext = store.Where(x => x.PR > 5).ToList();
tempStore = new M1Store()
{
SiteName = siteName,
Date = date,
url = IndexedPage,
TCY = YandexTCY.GetYandexTCY(IndexedPage),
PR = Pagerank.GetPR(IndexedPage)
};
store.Add(tempStore);
但是当我向商店集合添加新元素时,lv_Results不会更新。 我该如何更新ListView?
答案 0 :(得分:1)
将您的LINQ结果放入ObservableCollection中。 WPF和Silverlight数据绑定要求集合引发更改通知,ObservableCollection会为您执行此操作。否则你必须自己实施,这更加痛苦,完全没必要。
答案 1 :(得分:1)
您的问题是您希望在添加到“store”集合的所有项目上持续评估“Where”条件。内置的LINQ“Where”运算符不是为此而设计的。相反,当它由ListView枚举时,它会精确扫描您的集合一次,然后从此忽略它。
结帐Continuous LINQ。它旨在完全满足您的需求,几乎可以作为标准LINQ查询的替代品。
内置LINQ实施的限制
内置LINQ扩展方法的一个基本限制是它们生成的集合不支持INotifyPropertyChanged。因此,无论底层数据有多少变化,客户端都不会收到集合已更改的通知,因此永远不会刷新其数据显示。
用户jrista在评论中指出,如果重新枚举,内置LINQ方法确实会产生最新数据。虽然如此,但这没有实际效果。没有WinForms或WPF控件包含定期重新枚举其数据源的代码。当然,不这样做的原因是显而易见的:这将是非常浪费的。如果你每秒重新枚举10次并重新枚举和扫描更改需要10毫秒,那么你只需要使用10%的CPU用于一个控件!
答案 2 :(得分:0)
在你的代码中添加.ToList(),LINQ评估lazy,所以它只在需要时才会产生结果.ToList()是一个贪婪的运算符并强制进行评估。
[编辑]
抱歉,误解了你问题的第一个版本:)
这是我的解决方案:
ObservableCollection<M1Store> l = store.Where(x => x.PR > 5);
lv_Results.DataContext = l;
在以下所有步骤中,只需更改Observable集合l:
即可List<M1Store> otherList = GetFromAnywhere();
otherList.ForEach(e => l.Add(e));
此处Observable Collection的内部将更新UI中的listView。
答案 3 :(得分:0)
LINQ表达式的结果被输入一个新的List(T),它不会引发PropertyChanged或CollectionChanged事件。
使其工作的最简单方法是检索所需的结果,然后使用要显示的结果填充ObservableCollection(T)。随着ObservableCollection的添加,新项目将出现在ListView中。