我有一个绑定到listview的集合。此集合每4-5秒添加一次项目,新项目将自动添加到列表视图的底部。因此,如果您要查看最新的项目,则需要向下滚动到底部。
我的问题是: 是否有可能想要反转列表视图,以便新的最新项目位于最顶层,最旧的项目位于底部?
由于
答案 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);
其中任何一个都可以工作..