[英]bind linq expression
我的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?
將您的LINQ結果放入ObservableCollection。 WPF和Silverlight數據綁定要求集合引發更改通知,而ObservableCollection會為您執行此操作。 否則,您將不得不自己實施它,這更加痛苦並且完全沒有必要。
您的問題是您希望對添加到“商店”集合中的所有項目連續評估“位置”條件。 內置的LINQ“ Where”運算符並非旨在執行此操作。 相反,當ListView枚舉它時,它將只掃描一次您的集合,然后從此開始忽略它。
檢查連續LINQ 。 它旨在完全滿足您的需求,幾乎可以用作標准LINQ查詢的直接替代。
內置LINQ實現的局限性
內置LINQ擴展方法有一個基本限制,因為它們產生的集合不支持INotifyPropertyChanged。 因此,無論基礎數據發生了多少變化,客戶端都將永遠不會收到有關集合已更改的通知,因此永遠不會刷新其數據顯示。
用戶jrista在評論中指出,如果重新枚舉,內置LINQ方法實際上確實會生成最新數據。 雖然正確,但這沒有實際效果。 沒有WinForms或WPF控件包含用於定期重新枚舉其數據源的代碼。 當然,不這樣做的原因是顯而易見的:這將非常浪費。 如果您每秒重新枚舉10次,並且重新枚舉和掃描更改需要10毫秒,那么您只用一個控件就消耗10%的CPU!
將.ToList()添加到您的代碼中,LINQ評估延遲,因此僅在需要時才帶來結果,.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集合的內部將更新UI中的listView。
LINQ表達式的結果將被饋送到一個新的List(of T)中,該列表不會引發PropertyChanged或CollectionChanged事件。
使它工作最簡單的方法是檢索所需的結果,然后用要顯示的結果填充ObservableCollection(of T)。 隨着ObservableCollection的添加,新項將出現在ListView中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.