wpf - 如何向控件的事件添加新命令

标签 wpf mvvm

感谢您查看此问题。

我一直在按照 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/

相关文章:

wpf - 如何在 GridViewColumn 中居中 WPF CheckBox?

wpf - 在 WPF 应用程序中,是否有一个对象可以分配给 FileSystemWatcher.SynchronizingObject?

javascript - 连接 RESTful API 时如何正确处理无法连接错误

c# - 如何让子窗口与主窗口一起最小化和最大化

ListView 中的 WPF ListView

WPF Treeview - 与 ViewModel 同步?

c# - 如何在wpf mvvmlight中为datagrid实现 "nextpage"函数

mvvm - 在 MVVM 中将 ObservableCollection 绑定(bind)到数据网格

c# - 使用 SetBinding 的 Xamarin.Forms 绑定(bind)不起作用

c# - 将数据从数据网格绑定(bind)到 ui 组件