感谢您查看此问题。
我一直在按照 Josh Smith 的 MVVM 模式示例构建应用程序 (VB/WPF):Click here to view
我的 View 具有在事件(例如单击按钮)时触发命令的控件,并且这些控件绑定(bind)到 ViewModel 中的属性。
我的 ViewModel 公开 ICommand 类型的属性,这些属性调用适当的方法。
到目前为止,这一直很有效!我现在想使用拇指控件来允许用户在 Canvas 内移动对象。我不相信拇指具有“开箱即用”的命令功能。拇指移动时会引发“DragDelta”事件。所以我的问题如下:
如何扩展控件的能力以在发生事件时发出命令?
我希望发出一个新命令,比如“onDragDelta”,这样我就可以将它绑定(bind)到 ViewModel 中的属性,就像我的按钮一样。
非常感谢
最佳答案
您想要的是基于 FrameworkElement 的 RoutedEvent 在 ViewModel 中触发 ICommand。不幸的是,WPF 不支持这种“开箱即用”。一些可能性:
1) 在 Expression Blend 3 中,有 Microsoft.Expression.Interactivity.dll,它允许执行此操作。请参阅WPF : Blend 3 Interactions / Behaviours有关如何执行此操作的示例。
2) 您的代码隐藏中可以有一个事件处理程序,它直接调用适当的 ViewModel 命令。例如:
private void FrameworkElement_DragDelta(object sender, EventArgs e)
{
this.MyViewModel.OnDragDelta(sender, e);
}
3) 作为 Cinch 的一部分框架,有一个attached command behaviour 。这样,您就不必更改隐藏代码。例如:
Cinch:SingleEventCommand.RoutedEventName="DragDelta"
Cinch:SingleEventCommand.TheCommandToRun="{Binding Path=DragDeltaCommand}"
请注意,这会调用 ICommand 并传递一个对象(实际上是 SCommandArgs)作为命令参数。要在命令处理程序中获取实际的路由事件参数,请执行以下操作:
var sargs = args as SCommandArgs;
if (sargs == null)
{
return;
}
var routedEventArgs = sargs.EventArgs as RoutedEventArgs; // Or whatever arguments you actually expect
if (routedEventArgs == null)
{
return;
}
// Do something here with the event arguments
编辑:另请查看 Binding Commands to Events?
关于wpf - 如何向控件的事件添加新命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2682273/