【发布时间】:2014-08-08 15:07:54
【问题描述】:
早上好,提前感谢您的回答。
我的视图实现了一个平移和缩放库:A WPF Custom Control for Zooming and Panning
在视图中,有一个控件可以根据鼠标双击放大到一个点:
private void zoomAndPanControl_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if ((Keyboard.Modifiers & ModifierKeys.Shift) == 0)
{
Point doubleClickPoint = e.GetPosition(content);
zoomAndPanControl.AnimatedSnapTo(doubleClickPoint);
}
}
我想强制“zoomAndPanControl.AnimatedSnapTo(doubleClickPoint);”当我拉动它时,根据我绘制的几何点的 ViewModel 数据到一个特定的点。因此,视图将平移到新几何 x,y 坐标的点。几何体/点已绑定到视图。
作为补充说明,提取几何点的数据是在 DispatchTimer 中进行的。随着新几何坐标的读取,我希望视图可以平移并跟随这些坐标。
当我获取数据时,是否有一种简单的方法可以从 ViewModel 访问此控件?可能用自定义点模拟鼠标事件?我不确定最好的方法。
【问题讨论】:
-
首先 - 你的 ViewModel 和 View,在真正的 MVVM 中永远不应该相遇并且彼此一无所知。因此,告诉您的视图从视图模型中的数据执行某些操作需要绑定或数据触发器。查看您所显示的内容,对我来说最简单的事情是在您的 ZoomAndPanControl 中创建一个依赖属性,该属性在设置后会导致您所追求的行为(调用 AnimatedSnapTo) - 然后该属性可以绑定到您的视图模型。更改您的视图模型属性,绑定将触发操作。
-
@kidshaw 这不是真的。视图将持有对 viewModel 的引用。这是使数据绑定工作的唯一方法。视图将不可避免地知道视图模型。视图模型永远不应该知道它的用户。
-
好的,有道理。将依赖属性添加到 ZoomAndPanControl 库,以便我可以绑定。我希望有一个更简单的解决方案,因为视图已经可以使用控件......但我猜它就是这样。
-
@Shoe - 是的,我夸大了那里的分离。我倾向于实现 View Model Locator 模式,所以习惯于认为它们是通过接口分开的——你是对的。
-
我会将我的建议作为答案发布,以防它对您有用。