Действительно, я пропустил что-то тривиальное. Я забыл удалить ScrollViewer за пределами ItemsControl. Я думаю, это создает путаницу, поскольку ListBox имеет свой собственный ScrollViewer.
Это подняло еще один вопрос. Предыдущий ScrollViewer автоматически прокручивался вниз из кода позади. Теперь, когда я не могу добраться до ScrollViewer в ListBox, я не могу вызвать его LineDown метод. Вот мой обходной путь:
// Responses is the ItemsSource
Responses.Add(e);
// xResponses is the ListBox
var item = xResponses.ItemContainerGenerator.ContainerFromIndex(0);
ScrollBar.LineDownCommand.Execute(null, item as IInputElement);
В начале item может иметь значение null, однако это не создает проблемы. После добавления нескольких элементов, к счастью, перед тем, как нам нужно прокрутить, контейнер успешно возвращается. Обратите внимание, что индекс здесь не важен, все что нам нужно - это IInputElement внутри ScrollViewer.