WPF:listview显示最近添加的项目在顶部而不是底部

时间:2011-04-19 22:14:12

标签: c# wpf

我有一个绑定到listview的集合。此集合每4-5秒添加一次项目,新项目将自动添加到列表视图的底部。因此,如果您要查看最新的项目,则需要向下滚动到底部。

我的问题是: 是否有可能想要反转列表视图,以便新的最新项目位于最顶层,最旧的项目位于底部?

由于

4 个答案:

答案 0 :(得分:19)

使用Insert代替Add

collection.Insert(0, newItem);

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

答案 1 :(得分:0)

即使你已经将其他答案投票接受,正如他们所指出的那样,虽然这是一个简单的单行解决方案,但它会进行大量的转移,这会影响性能。

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

如果您需要此处的代码示例,请告诉我,我将提供一个。

答案 2 :(得分:0)

两种方法:

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);

答案 3 :(得分:-1)

将排序顺序设置为降序并使用添加项

this.listView1.Sorting = System.Windows.Forms.SortOrder.Descending;

listView1.Items.Add( listviewitem);

或删除排序并插入项目

listView1.Items.Insert(0, listviewitem);

其中任何一个都可以工作..