【问题标题】:Display the 5 newest Items of ObservableCollection in WPF ListView depending on Timestamp根据时间戳在 WPF ListView 中显示 ObservableCollection 的 5 个最新项
【发布时间】:2017-02-22 18:11:58
【问题描述】:

我有一个通过 CollectionViewSource 绑定到 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

【问题讨论】:

    标签: wpf vb.net xaml


    【解决方案1】:

    您可以在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() 方法。

    【讨论】:

    • 这对我不起作用,看起来只有在 LiveFilteringProperties 发生变化时才会重新应用过滤器。我发现 CollectionViewSource 上的刷新再次对每个项目进行过滤......我想我可以使用这个
    • 是的,过滤器仅在 TS 属性更改时重新评估。另一种选择是调用 Refresh() 方法。我编辑了我的答案以澄清这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多