为什么这不可能马上?
因为 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
}
代表变得就像我在上面向您展示的那样。