如何使用Caliburn.Micro绑定到具有委托的事件?

时间:2013-08-02 18:19:53

标签: caliburn.micro

通常我可以绑定到这样的事件:

 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);

任何帮助解决这个问题都将非常感谢!

谢谢, 小号

1 个答案:

答案 0 :(得分:1)

  

为什么不能马上做到这一点?

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

  

如何解决这个问题?

最简单的解决方案是更改代理签名,如果你看起来像这样:

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

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

  

如果您无法更改代表的签名怎么办?

然后你必须通过从拥有该事件的类型派生来创建Adapter,或者如果它被密封则包装该类型,然后使用上面显示的签名声明一个新事件,然后听参加新活动。

  

还有其他办法吗?

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

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

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

并且代表变得像我在上面给你看的那样。