Событие OnScrollChanged для моего ScrollViewer в MVVM WPF

Я хочу использовать присоединенное свойство для обработки события ScrollChanged моего ScrollViewer. В данный момент событие и логика обрабатываются в коде пользовательского интерфейса, что явно противоречит MVVM. Мне было интересно, есть ли у кого-нибудь идеи о том, как это сделать с прикрепленными свойствами? Единственные ресурсы, которые я нашел, кажутся очень длинными. Вот код, который у меня есть на данный момент:

XAML:

<ScrollViewer x:Name="MyScroller" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" ScrollChanged="MyScroller_OnScrollChanged">

Отложенный код пользовательского интерфейса:

private void MyScroller_OnScrollChanged(object sender, ScrollChangedEventArgs e) {
            var scrollViewer = sender as ScrollViewer;


            if ((Math.Abs(e.ExtentHeightChange) < 0) && (Math.Abs(e.ExtentWidthChange) < 0)) return;
            var xMousePositionOnScrollViewer = Mouse.GetPosition(scrollViewer).X;
            var yMousePositionOnScrollViewer = Mouse.GetPosition(scrollViewer).Y;
            var offsetX = e.HorizontalOffset + xMousePositionOnScrollViewer;
            var offsetY = e.VerticalOffset + yMousePositionOnScrollViewer;

            var oldExtentWidth = e.ExtentWidth - e.ExtentWidthChange;
            var oldExtentHeight = e.ExtentHeight - e.ExtentHeightChange;

            var relx = offsetX / oldExtentWidth;
            var rely = offsetY / oldExtentHeight;

            offsetX = Math.Max(relx * e.ExtentWidth - xMousePositionOnScrollViewer, 0);
            offsetY = Math.Max(rely * e.ExtentHeight - yMousePositionOnScrollViewer, 0);



            scrollViewer.ScrollToHorizontalOffset(offsetX);
            scrollViewer.ScrollToVerticalOffset(offsetY);
        }

person danny10846    schedule 07.05.2019    source источник
comment
Утверждение, что событие и логика обрабатываются в коде пользовательского интерфейса ... очевидно, идет вразрез с MVVM - это заблуждение. MVVM не означает, что у вас не может быть кода в вашем пользовательском интерфейсе.   -  person Clemens    schedule 07.05.2019
comment
@Clemens Значит, вы думаете, что этот код принадлежит коду пользовательского интерфейса, а не обрабатывается в присоединенном классе свойств? Искренне спрашивая, как я и предполагал, не могли бы вы лучше убрать какой-либо код из кода пользовательского интерфейса.   -  person danny10846    schedule 07.05.2019
comment
Вы не объяснили, что именно должен делать код, но мне кажется, что это связано исключительно с представлением. Нет необходимости иметь это в вашей модели представления.   -  person Clemens    schedule 07.05.2019
comment
@Clemens У меня есть функция масштабирования в моей модели представления с помощью масштабного преобразования - это просто смещение колеса прокрутки, поэтому я не прокручиваю вверх одновременно с увеличением.   -  person danny10846    schedule 07.05.2019
comment
Этот код очень специфичен для просмотра. Такие вещи могут быть выполнены либо как код для какого-то пользовательского элемента управления / настраиваемого элемента управления, либо как поведение. В любом случае вы можете вручную протестировать один раз, а затем использовать много раз. Если это относится к одному представлению, перемещать его не имеет смысла.   -  person Andy    schedule 07.05.2019
comment
@ danny10846 Я бы поместил в представление ScaleTransform. В некоторых случаях я мог бы сохранить коэффициент масштабирования в модели просмотра как свойство Zoom. В любом случае. Никто не отвечает на вопрос, поэтому я отвечу: прикрепленное свойство просто присоединит тот же обработчик событий к целевому событию ScrollChanged. Очень простой.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 07.05.2019
comment
@ danny10846 Этот ответ обрабатывает событие TextChanged через поведение - игнорируйте все, кроме того, как он обрабатывает это событие, есть там много всего, что не относится к вашему вопросу. Ваш обработчик PropertyChanged будет состоять только из одной строки: (d as ScrollViewer).ScrollChanged += MyStaticScrolllChangedHandler;   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 07.05.2019
comment
@EdPlunkett Привет, Эд, я прочитал твою ссылку и, кажется, решил мою проблему. Я создал присоединенный класс свойств, в котором я определил свою логику для смещения прокрутки, а затем просто добавил: <i:Interaction.Behaviors> <attachedProperties:ScrollBehaviour> </attachedProperties:ScrollBehaviour> </i:Interaction.Behaviors> в свой XAML. Спасибо за вашу помощь!   -  person danny10846    schedule 10.05.2019