WPF: отображение списка недавно добавило элементы сверху, а не внизу

Я получил привязку коллекции к списку. Эта коллекция получает элементы, добавленные каждые 4-5 секунд, и новые элементы будут автоматически добавлены в нижней части списка. Поэтому, если вы увидите самые новые предметы, вам нужно прокрутить вниз.

Мой вопрос: возможно ли, как обратное listview, чтобы новые новейшие элементы были сверху и самые старые элементы внизу?

Спасибо

Ответ 1

Используйте Insert вместо Add:

collection.Insert(0, newItem);

Обратите внимание, что он медленнее, чем Add, поскольку он должен сдвигать все позиции на 1 позицию. Это может быть проблемой, если список очень большой.

Ответ 2

Несмотря на то, что вы уже проголосовали за другой ответ как принято, как они указали, хотя это простое однострочное решение, которое сильно изменяет и может повлиять на производительность.

ИМХО, лучший, правильный способ сделать это - использовать сортировку. Легко получить представление по умолчанию коллекции, затем применить сортировку к нему или просто использовать CollectionViewSource и применить сортировку там. Конечно, это означает, что вам нужно иметь поле для сортировки, но это может быть так же просто, как добавление свойства индекса, если у вас еще нет отметки времени или чего-то подобного.

Сообщите мне, хотите ли вы здесь пример кода, и я предоставлю его.

Ответ 3

Два подхода:

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

Ответ 4

Установить порядок сортировки в порядке убывания и использовать элементы добавления

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

listView1.Items.Add( listviewitem);

или удалить сортировку и вставить элемент

listView1.Items.Insert(0, listviewitem);

любой из них будет работать.