根据时间戳,在WPF ListView中显示ObservableCollection的5个最新项

根据时间戳,在WPF ListView中显示ObservableCollection的5个最新项,wpf,vb.net,xaml,Wpf,Vb.net,Xaml,我有一个通过CollectionViewSource绑定到ListView的ObservableCollection。我只想显示5个最新条目 我尝试筛选项目,但该筛选器似乎只影响上次输入的项目。因为这是最新的,所以它当然会被展示出来。不知何故,在添加新项目后,所有项目都必须再次过滤 有人能给我指出一个解决办法吗 下面是一些代码: Public Class myItem Dim TS as DateTime End Class Public myList as ObservableCol

我有一个通过CollectionViewSource绑定到ListView的ObservableCollection。我只想显示5个最新条目

我尝试筛选项目,但该筛选器似乎只影响上次输入的项目。因为这是最新的,所以它当然会被展示出来。不知何故,在添加新项目后,所有项目都必须再次过滤

有人能给我指出一个解决办法吗

下面是一些代码:

Public Class myItem
    Dim TS as DateTime
End Class

Public myList as ObservableCollection(Of myItem)
XAML:


您可以在
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>

TS
在CollectionViewSource中启用实时筛选:


另一个选项是,每当您要重新应用筛选器时,调用CollectionViewSource的
Refresh()
方法。

这对我不起作用,看起来只有在LiveFilteringProperties发生更改时才重新应用筛选器。我发现CollectionViewSource上的刷新会再次对每个项目进行筛选。。。我想我可以这样做是的,只有当TS属性改变时,才会重新评估过滤器。另一个选项是调用Refresh()方法。我编辑了我的答案以澄清这一点。
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
<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>