2017-02-21 74 views
2

我有一個ObservableCollection綁定到ListView通過CollectionViewSource。我只想顯示5個最新的條目。根據時間戳顯示WPF ListView中的ObservableCollection的5個最新項目

我嘗試過濾項目,但它看起來像過濾器隻影響最後輸入的項目。而且,由於這是最新顯示的。不知何故,所有物品在添加新物品後都必須再次過濾。

有人可以指點我的解決方案。

這裏是一些代碼:

Public Class myItem 
    Dim TS as DateTime 
End Class 

Public myList as ObservableCollection(Of myItem) 

XAML:

<CollectionViewSource Source="{Binding myList}" x:Key="cvs" Filter="MyCVS_Filter"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="TS" Direction="Descending"/> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 

篩選:

Private Sub MyCVS_Filter(sender As Object, e As FilterEventArgs) 
    Dim item As myItem = TryCast(e.Item, myItem) 
    Dim listcvs As CollectionViewSource = TryCast(sender, CollectionViewSource) 
    Dim list_view As IEnumerable(Of myItem) = TryCast(Listcvs.Source, IEnumerable(Of myItem)).OrderBy(Function(x) x.TS) 

    If (list_view.Count >= 4) AndAlso (list_view(4).TS >= item.TS) Then 
      e.Accepted = False 
     Else 
      e.Accepted = True 
     End If 
End Sub 

回答

0

您可以啓用在CollectionViewSource實時過濾:

<CollectionViewSource Source="{Binding myList}" x:Key="cvs" Filter="MyCVS_Filter" 
           xmlns:s="clr-namespace:System;assembly=mscorlib" 
           IsLiveFilteringRequested="True"> 
    <CollectionViewSource.LiveFilteringProperties> 
     <s:String>TS</s:String> 
    </CollectionViewSource.LiveFilteringProperties> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="TS" Direction="Descending"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

在CollectionViewSource啓用實時過濾:https://wpf.2000things.com/2014/01/17/989-enabling-live-filtering-in-a-collectionviewsource/

的另一個選項是調用CollectionViewSource的Refresh()方法,每當你想重新應用過濾器。

+0

這對我不起作用,看起來像過濾器只在LiveFilteringProperties更改時重新應用。我發現在CollectionViewSource上進行了一次刷新,然後再次爲每個Item執行過濾......我想我可以使用這個 – HaWe

+0

是的,只有當TS屬性發生變化時纔會重新評估過濾器。另一個選項是調用Refresh()方法。我編輯了我的答案來澄清這一點。 – mm8

相關問題