Ответ 1
Используйте Insert
вместо Add
:
collection.Insert(0, newItem);
Обратите внимание, что он медленнее, чем Add
, поскольку он должен сдвигать все позиции на 1 позицию. Это может быть проблемой, если список очень большой.
Я получил привязку коллекции к списку. Эта коллекция получает элементы, добавленные каждые 4-5 секунд, и новые элементы будут автоматически добавлены в нижней части списка. Поэтому, если вы увидите самые новые предметы, вам нужно прокрутить вниз.
Мой вопрос: возможно ли, как обратное listview, чтобы новые новейшие элементы были сверху и самые старые элементы внизу?
Спасибо
Используйте 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);
Установить порядок сортировки в порядке убывания и использовать элементы добавления
this.listView1.Sorting = System.Windows.Forms.SortOrder.Descending;
listView1.Items.Add( listviewitem);
или удалить сортировку и вставить элемент
listView1.Items.Insert(0, listviewitem);
любой из них будет работать.