На мой взгляд, у меня есть:
<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?