gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:15:30 26 4
gpt4 key购买 nike

感谢您查看这个问题。

我一直在按照 Josh Smith 的 MVVM 模式示例构建应用程序 (VB/WPF):Click here to view

我的 View 具有在事件(例如按钮单击)时触发命令的控件,这些控件绑定(bind)到 ViewModel 中的属性。

我的 ViewModel 公开了调用适当方法的 ICommand 类型的属性。

这一直运作良好,直到现在!我现在想使用拇指控件来允许用户在 Canvas 中移动对象。我不相信 Thumb 具有“开箱即用”的命令能力。 Thumb 在移动时会引发“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com