2013-08-02 28 views
0

通常我可以綁定到一個事件,像這樣:如何使用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); 

任何幫助搞清楚這將不勝感激!

感謝, 小號

+0

這是您創建的自定義事件,換句話說,您可以修改委託人的簽名嗎? –

回答

1

爲什麼這是不可能的,對嗎?

因爲Caliburn.Micro使用混合SDK的交互功能,語法轉換([事件DragStarting] = [動作OnDragStarting($源,EventArgs的$))EventTriggerEventTrigger類不能與返回值的事件一起工作,如果你認爲它是合乎邏輯的,那麼返回值應該如何處理。一般來說,事件返回值是一種不好的做法,你很少遇到這樣的事件。

如何解決這個問題?

最簡單的解決辦法是改變委託簽名,如果你能到這個樣子:

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

然後你轉換的是布爾值返回對DropEventArgs類中的公共屬性,即卡利後.Micro語法將正常工作。

如果您不能更改委託人的簽名怎麼辦?

然後,你將不得不從擁有該事件的類型派生或包裝這種類型的,如果它被密封,以創建一個Adapter然後聲明與簽名新的事件我發現你在上面,然後聽新的事件。

還有別的辦法嗎?

也許你可以創建一個自定義事件觸發器,從TriggerBase<T>派生可以與有返回值的事件工作,但是這是一種先進的技術,這是一個有點難以實現了,反正你不會到能再使用CM的語法。

編輯:我的意思是讓DropEventArgs類具有的屬性,而不是從委託其返回,所以DropEventArgs變得像這樣:

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

和委託變得像我展示你在上面。

+0

嗨,嗅探器,感謝您的幫助!我通過成功繼承原始控件創建了自己的控件。我對這行有點困惑....「然後你將該bool值轉換爲DropEventArgs類的公共屬性,之後Caliburn.Micro語法將正常工作」。你能給我一個你的意思嗎?謝謝:-) – MrTouya

+0

@MrTouya我編輯了我的答案,請檢查編輯。 –