在我看來,我有:如何在我的WPF 3D應用程序中MVVM-ize這個MouseDown代碼?
<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的任何建議?
@DanM我們一直在採取這種方法,進入ViewModel的邏輯應該在UI主機之外工作。如果你要在特定的代碼上運行測試,它會執行還是失敗,因爲沒有ViewportInfo?如果失敗了,那麼這個邏輯應該像Daniel所說的那樣回到用戶界面。記住MVVM的主要優點之一就是自動單元測試。 – Agies 2010-05-27 03:07:16