Как мне MVVM-ize этот код MouseDown в моем приложении WPF 3D? - PullRequest
1 голос
/ 27 мая 2010

На мой взгляд, у меня есть:

<UserControl x:Class ... MouseDown="UserControl_MouseDown"> 
    <Viewport3D Name="Viewport" Grid.Column="0">
        ...
    </Viewport3D >
</UserControl>

В моем коде есть:

private void UserControl_MouseDown(object sender, MouseButtonEventArgs e)
{
    ((MapPanelViewModel)DataContext).OnMouseDown(e, Viewport);
}

И в моей модели просмотра у меня есть:

public void OnMouseDown(MouseEventArgs e, Viewport3D viewport)
{
    var range = new LineRange();
    var isValid = ViewportInfo.Point2DtoPoint3D(viewport, e.GetPosition(viewport), out range);
    if (!isValid)
        MouseCoordinates = "(no data)";
    else
    {
        var point3D = range.PointFromZ(0);
        var point = ViewportInfo.Point3DtoPoint2D(viewport, point3D);
        MouseCoordinates = e.GetPosition(viewport).ToString() + "\n" + point3D + "\n" + point;
    }
}

У меня действительно нет хорошего понимания того, как обрабатывать события мыши с помощью MVVM. Я всегда просто заканчиваю тем, что помещаю их в код позади и приводим DataContext как SomeViewModel, а затем передаю MouseEventArgs обработчику в моей модели представления. Это уже достаточно плохо, но в этом случае я фактически передаю элемент управления (Viewport3D), который необходим для перевода координат между 2D и 3D.

Любые предложения о том, как сделать это более гармоничным с MVVM?

Ответы [ 3 ]

2 голосов
/ 27 мая 2010

Я думаю, что это тот случай, когда MVVM зашел слишком далеко. Конечно, MVVM точно не определен, но я думаю об этом с точки зрения попыток отделить механику и поведение высокого уровня моих приложений от деталей того, как эти механизмы и поведения реализуются с использованием определенной технологии пользовательского интерфейса (сегодня это просто WPF конечно, но я считаю полезным сделать вид, что может быть что-то еще).

Не зная, как ваше приложение должно реагировать на события мыши, трудно дать конкретный совет или мнение. Исходя из того, что я делаю , я думаю, что перевод координат лучше оставить в слое пользовательского интерфейса, а затем переведенные координаты будут переданы в ViewModel с помощью вызова метода.

1 голос
/ 27 мая 2010

Если вы беспокоитесь о том, чтобы нарушить тестируемость, передав объект View в вашу ViewModel, создайте интерфейс для преобразования между 3D и 2D-точками и вместо этого передайте его. В своем коде вы затем пропускаете объект Viewport3D в оболочку, которая реализует этот интерфейс.

Кроме этого, я бы не беспокоился об обработчиках событий в коде. Используйте привязки для всего, что легко, используйте код для действительно сложных частей.

0 голосов
/ 31 июля 2010

Я закончил с использованием MVVM Messenger. Итак, событие мыши обрабатывается в коде позади, а затем отправляет сообщение о том, что событие произошло. Затем моя ViewModel может подписаться на это сообщение и получать уведомления. Работает как шарм и держит все в отрыве.

...