2

我有一个具有绘图表面的应用程序,用户在其中执行的操作与鼠标光标的位置密切相关。例如,假设我正在尝试实现粘贴。在这种情况下,从用户的角度来看,粘贴的数据应该大致放置在视口的中心。

但是,像“视口”这样的概念是视图关注点,而不是视图模型关注点。但是要粘贴的操作是视图模型问题,而不是视图问题。

这个场景应该如何设计用于 MVVM 系统?

4

1 回答 1

3

由于没有可以绑定的鼠标位置属性(您将使用Mode=OneWayToSource),您可以监听MouseMove事件:

    private void OnMouseMove(object sender, MouseEventArgs e)
    {
        myViewModel.MousePosition = e.GetPosition(this);
    }

在你说这不是 MVVM 之前,因为它使用代码隐藏,来自http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

在某些情况下,代码隐藏可能包含 UI 逻辑代码,这些代码实现了难以用可扩展应用程序标记语言 (XAML) 表达的视觉行为,例如复杂的动画,或者当代码需要直接操作视觉元素时视图的一部分。您不应将任何逻辑代码放在需要进行单元测试的视图中。通常,视图代码隐藏中的逻辑代码将通过 UI 自动化测试方法进行测试。

正如所指出的,另一种方法可能是使用 CallMethodAction 将事件调用绑定到 ViewModel 上的方法调用:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity
xmlns:ei="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactions


<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseMoved">
        <ei:CallMethodAction TargetObject={Binding} MethodName="OnMouseMoved"/>
     </i:EventTrigger>
</i:Interaction.Triggers>

但是我不喜欢在这里使用绑定,因为事件会非常频繁地引发并且绑定会涉及更多开销。

于 2013-10-24T00:22:57.480 回答