簡體   English   中英

綁定linq表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM