根据时间戳,在WPF ListView中显示ObservableCollection的5个最新项
我有一个通过CollectionViewSource绑定到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
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>