0

通常我可以像这样绑定到一个事件:

 cal:Message.Attach="[Event DragStarting] = [Action OnDragStarting($source,$eventArgs)]"

那是当一个事件具有这样的签名时:

public event EventHandler<DragDropCancelEventArgs> DragStarting;

如何附加到具有如下委托的事件:

 public event CanDropEventHandler IDropTargetCanDropElement;
 public delegate bool CanDropEventHandler(object sender, DropEventArgs e);

任何帮助弄清楚这一点将不胜感激!

谢谢,

4

1 回答 1

1

为什么这不可能马上?

因为 Caliburn.Micro 使用 Blend SDK 的交互功能将语法([Event DragStarting] = [Action OnDragStarting($source,$eventArgs)])转换为 anEventTrigger并且EventTrigger该类不能处理返回值的事件,如果您认为这是合乎逻辑的,如何处理该返回值。一般来说,事件返回值是一种不好的做法,而且您很少遇到此类事件。

如何解决这个问题?

如果您可以看起来像这样,最简单的解决方案是更改委托签名:

public delegate void CanDropEventHandler(object sender, DropEventArgs eventArgs);

然后将返回的布尔值转换为DropEventArgs类的公共属性,之后 Caliburn.Micro 语法将正常工作。

如果您不能更改代表的签名怎么办?

然后,您必须通过从拥有该事件的类型派生或包装该类型(如果它是密封的)来创建一个适配器,然后使用我在上面显示的签名声明一个新事件,然后收听新事件。

还有其他方法吗?

也许您可以创建一个自定义事件触发器,从TriggerBase<T>它派生可以处理具有返回值的事件,但这是一种很难实现的高级技术,无论如何您将无法再使用 CM 的语法。

编辑:我的意思是使DropEventArgs类具有该属性,而不是从委托中返回它,因此DropEventArgs变成这样:

class DropEventArgs : EventArgs {
    public bool CanDrop {get; set;} // OR CHOOSE WHATEVER NAME YOU WANT
}

代表变得就像我在上面向您展示的那样。

于 2013-08-03T10:34:41.733 回答