ViewModel должен отделить код пользовательского интерфейса от дизайна пользовательского интерфейса (например, XAML). [Разделение проблем дизайнера и разработчика, автоматическое тестирование кода пользовательского интерфейса и т. Д.)
В идеале файл с обратным кодом для представления будет пустым (кроме вызова InitializeComponent), и вся логика и состояние пользовательского интерфейса будут обрабатываться ViewModel. Однако на практике могут быть некоторые специфические манипуляции с пользовательским интерфейсом, которые не могут обрабатываться только привязкой данных, и вам нужно будет прибегнуть к коду. Такой код следует помещать в код.
В вашем случае логика для (a) когда и (b) какой элемент прокрутки должен находиться в ViewModel (не в представлении). Только любая дополнительная логика, необходимая для выполнения фактической прокрутки в ListView, будет находиться в представлении «Код».
Да, мероприятие было бы идеальным способом сделать это, чтобы избежать каких-либо ссылок на представление внутри ViewModel. Однако я рекомендовал бы создать настраиваемое событие в ViewModel (например, OnFirstItemInViewChanged с аргументами элемента для прокрутки) и в регистре View code-behind для этого события и просто вызвать ListView.ScrollIntoView (элемент).
Примечание: У WinForms DataGridView было свойство FirstDisplayedScrollingRowIndex. Если в WPF ListView было что-то похожее, вы можете решить эту проблему, привязав это свойство к свойству ViewModel, в результате чего код-код полностью очистится.