Сбросить полосу прокрутки при изменении ItemsSource - PullRequest
1 голос
/ 18 ноября 2011

Всякий раз, когда я изменяю ItemsSource (или запускает сброс коллекции), WPF не сбрасывает позицию полосы прокрутки ListView / DataGrid наверх.Это не страшно, если есть хороший способ сделать это вручную, но кажется, что нет.

В настоящее время я делаю:

ScrollViewer.ScrollToTop();
ScrollViewer.UpdateLayout();
Grid.ItemsSource = Data;

Что вызывает некоторое мерцание из-заUpdateLayout сначала перерисовывает элемент управления.

Другой способ заключается в следующем:

Grid.ItemsSource = Data;
ScrollViewer.ScrollToTop();

Кажется, это не вызывает мерцания, но поскольку позиция прокрутки изменена ПОСЛЕ того, как установлен ItemSource,он заставляет WPF сначала перебрать неправильные элементы в ItemsSource, прежде чем он получит правильные элементы (со смещением 0).Поскольку коллекция виртуализирована, это вызывает ненужные запросы SQL для элементов, которые никогда не будут отображаться.

Есть ли другой способ сделать это, который не мерцает или сначала извлекает неправильные элементы?

1 Ответ

0 голосов
/ 18 ноября 2011

Только что прикрепил это событие к элементу управления, который будет содержать коллекцию:

Предполагая, что это список:

lstItems.SourceUpdated += new EventHandler<DataTransferEventArgs>(lstItems_SourceUpdated);

Тогда у вас будет событие, которое выглядит следующим образом.

    void lstItems_SourceUpdated(object sender, DataTransferEventArgs e)
    {
        ScrollViewerName.ScrollToTop();
    }
...