Показать последний элемент, добавленный в ItemsControl - PullRequest
2 голосов
/ 06 мая 2011

Я не могу поверить, что не смог найти решение этой проблемы после полчаса поиска в Google и SO.

У меня есть ObservableCollection<string> в моей ViewModel, что ListBox в моем представлении привязано к:

<ListBox ItemsSource="{Binding Output}" IsSynchronizedWithCurrentItem="True" />

Когда кнопка нажата, новый поток выполняет какие-то действия и, используя Observable, виртуальная машина отслеживает строки, возвращающиеся из этой асинхронной операции, и добавляет строки вего Output ObservableCollection.Строки добавляются без проблем, но как сделать так, чтобы в представлении всегда отображался последний элемент (последний добавленный элемент)?

1 Ответ

3 голосов
/ 06 мая 2011

Ваш предмет появляется в списке, но только дальше? Если это так, все, что вам нужно сделать, это сказать списку, чтобы прокрутить этот элемент в поле зрения. Вы можете сделать это, подписавшись на ColllectionChanged свойства ListBox.Items. Сделать это немного сложно, потому что вы должны разыграть его, но вы можете сделать это с помощью кода, подобного следующему:

((INotifyCollectionChanged)MainListBox.Items).CollectionChanged +=  ListBox_CollectionChanged;

Затем внутри этого события вы можете добавить код, подобный этому:

private void ListBox_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems.Count > 0)
        {
            Dispatcher.BeginInvoke(() =>
            {
                 MainListBox.ScrollIntoView(e.NewItems[0]);
            }, DispatcherPriority.SystemIdle);
        }
    }

Также я только что нашел способ, которым вы можете сделать это с помощью прикрепленного свойства, которое довольно круто. Проверьте это здесь: http://michlg.wordpress.com/2010/01/16/listbox-automatically-scroll-currentitem-into-view/

...