代码之家  ›  专栏  ›  技术社区  ›  devuxer

在我的WPF 3D应用程序中,我如何对这个鼠标悬停代码进行MVVM大小调整?

  •  1
  • devuxer  · 技术社区  · 14 年前

    在我看来,我有:

    <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 到我的视图模型中的处理程序。这已经够糟糕了,但在这种情况下,我实际上是在传递一个控件(a Viewport3D ,这是在二维和三维之间转换坐标所必需的。

    有什么关于如何使它更符合MVVM的建议吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Daniel Pratt    14 年前

    我认为这是一个让MVVM走得太远的案例。当然,MVVM并没有被精确定义,但我认为它是试图将我的应用程序高级机制和行为与那些机制和行为如何使用特定的UI技术实现的细节分开的(当然,现在只是WPF,但我发现假装可能还有其他东西是有用的)。

    不知道应用程序对鼠标事件的反应如何,很难给出具体的建议或意见。基于我 我认为坐标转换最好留在UI层中,然后通过方法调用将转换后的坐标传递给ViewModel。

        2
  •  1
  •   Jamie Penney    14 年前

    如果您担心通过将视图对象传递给视图模型来破坏可测试性,请创建一个用于在三维点和二维点之间转换的接口,然后将其传递给视图模型。在您的代码后面,然后通过 Viewport3D 在实现该接口的包装器中的。

    除此之外,我不会担心代码隐藏中的事件处理程序。对于所有容易的事情都使用绑定,对于真正棘手的部分使用代码隐藏。

        3
  •  0
  •   devuxer    14 年前

    我最终使用了MVVM信使。因此,鼠标事件在代码隐藏中得到处理,然后它发送一条消息,说明事件发生了。然后,我的视图模型可以订阅此消息并接收通知。像一个魅力,保持一切脱钩。