通常我可以绑定到这样的事件:
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);
任何帮助解决这个问题都将非常感谢!
谢谢, 小号
答案 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
}
并且代表变得像我在上面给你看的那样。