WPF:listview显示最近添加的项目在顶部而不是底部
我有一个绑定到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 = .Last(); lvCallHistory.ScrollIntoView(lvCallHistory.SelectedItem);
将排序顺序设置为降序并使用添加项目
this.listView1.Sorting = System.Windows.Forms.SortOrder.Descending; listView1.Items.Add( listviewitem);
或删除排序和插入项目
listView1.Items.Insert(0, listviewitem);
其中任何一个都可以工作..