2012-10-04 64 views
2

我有一個自定義控件(MyControl)公開自定義命令。我希望父代Window能夠調用此命令,並且所有MyControls都應該對它做出反應。RoutedCommand使用隧道而不是冒泡

我已將命令添加到MyControlCommandBindings集合,該集合還提供始終返回true的CanExecute回調。

我的問題是調用此命令的菜單項永遠無法啓用。我假設這是因爲菜單在視覺樹中的MyControls之上,但說實話,我對RoutedUICommand的範圍如何工作確實有些模糊。

有人可以澄清我做錯了什麼,或者如果這甚至可能嗎?

回答

0

是的,重點在於您的自定義命令的CommandBinding位於視覺樹中菜單項的下方。從msdn

當調用RoutedCommand上的CanExecute方法時,會在命令目標上引發PreviewCanExecute事件。如果未處理事件,則引發CanExecute事件。如果命令目標具有該命令的CommandBinding,則調用該CommandBinding的CanExecute處理程序。 如果命令目標沒有該命令的CommandBinding,則CanExecute事件將冒泡查找具有與該命令關聯的CommandBinding的元素的元素樹。

關於命令的一篇很好的文章在at this link

反正你可以從你的菜單項,如

<MenuItem Header="Click me" Command="local:CommandClass.MyCustomCommand" CommandTarget="{Binding ElementName=myCustomCtrl}" /> 

使用CommandTarget命令這樣一個特定的命令源(菜單項)指示該命令的具體目標(例如自定義控制的) 。

+1

不幸的是我需要MyControl的所有實例來響應,而不僅僅是一個,所以CommandTarget對我來說沒有用處。已經標記了你的答案,因爲你已經確認這是不可能的。 – GazTheDestroyer

1

我猜命令在這裏是錯誤的意思。

命令用於將不同的命令觸發源綁定到一個命令處理程序。 因此,命令是由不同的控件,菜單觸發的......但是調用了相同的命令處理程序。

事件有點相反。 一個源可以觸發多個事件處理程序。

在你的特殊情況下,我寧願一個事件,UI樹下的控件也會傾聽隧道事件或冒泡事件。