列表视图将最近添加的项目显示在顶部而不是底部

本文关键字:顶部 底部 显示 项目 视图 最近 添加 列表 | 更新日期: 2023-09-27 17:50:31

我得到了一个集合绑定到listview。这个集合每4-5秒添加一个项目,新项目将自动添加到列表视图的底部。所以如果你想看到最新的项目,你需要向下滚动到底部。

我的问题是:是否有可能像反向列表视图,使最新的项目在顶部和最旧的项目在底部?

谢谢

列表视图将最近添加的项目显示在顶部而不是底部

Insert代替Add:

collection.Insert(0, newItem);

请注意,它比Add慢,因为它必须将所有物品移动1个位置。如果列表非常大,这可能是个问题。

即使你已经投票接受了另一个答案,正如他们指出的那样,虽然这是一个简单的,一行的解决方案,但它做了很多改变,这可能会影响性能。

恕我直言,更好、正确的方法是使用排序。很容易获得集合的默认视图,然后对其应用排序,或者只是使用CollectionViewSource并在那里应用排序。当然,这意味着你必须有一个字段来排序,但如果你还没有时间戳或类似的东西,那就像添加一个索引属性一样简单。

如果你想要一个代码示例,请告诉我,我会提供一个。

两种方法:

1)使用CollectionChange事件来捕获列表中的任何项更改。然后按降序排序列表,然后呈现。

// subscribe to CollectionChanged event of the ObservableCollection
_recordingsHidden.CollectionChanged += RecordingsHiddenOnCollectionChanged;
private void RecordingsHiddenOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
{
        var view = (CollectionView)CollectionViewSource.GetDefaultView(lvCallHistory.ItemsSource);
        view.SortDescriptions.Add(new SortDescription("StartTime", ListSortDirection.Descending));
}

这里'lvCallHistory'是我的列表视图和排序是基于'StartTime'完成的。这种方法只有在列表包含较少的项目时才有效。因为排序是一项代价高昂的操作,而且如果频繁更新列表,那么它可能会影响应用程序的性能。每次渲染视图时,用户可能会遇到2-3秒的延迟。

2)避免排序:每次更新列表时,将滚动条指向最后添加的项。(优点:非常有效,没有性能问题。缺点:项目仍然被添加到列表的末尾,即使滚动条在出现新条目时将您带到新项目
lvCallHistory.SelectedItem = <your_collection>.Last();
lvCallHistory.ScrollIntoView(lvCallHistory.SelectedItem);

设置排序顺序为降序,并使用add items

this.listView1.Sorting = System.Windows.Forms.SortOrder.Descending;
listView1.Items.Add( listviewitem);

或删除排序并插入项

listView1.Items.Insert(0, listviewitem);