我有一个具有绘图表面的应用程序,用户在其中执行的操作与鼠标光标的位置密切相关。例如,假设我正在尝试实现粘贴。在这种情况下,从用户的角度来看,粘贴的数据应该大致放置在视口的中心。
但是,像“视口”这样的概念是视图关注点,而不是视图模型关注点。但是要粘贴的操作是视图模型问题,而不是视图问题。
这个场景应该如何设计用于 MVVM 系统?
我有一个具有绘图表面的应用程序,用户在其中执行的操作与鼠标光标的位置密切相关。例如,假设我正在尝试实现粘贴。在这种情况下,从用户的角度来看,粘贴的数据应该大致放置在视口的中心。
但是,像“视口”这样的概念是视图关注点,而不是视图模型关注点。但是要粘贴的操作是视图模型问题,而不是视图问题。
这个场景应该如何设计用于 MVVM 系统?
由于没有可以绑定的鼠标位置属性(您将使用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>
但是我不喜欢在这里使用绑定,因为事件会非常频繁地引发并且绑定会涉及更多开销。