尋找在反射器MenuItem
,我們可以看到菜單項如何拿起Header
/InputGesture
值,這是:
private static object CoerceInputGestureText(DependencyObject d, object value)
{
RoutedCommand command;
MenuItem item = (MenuItem) d;
if ((string.IsNullOrEmpty((string) value) &&
!item.HasNonDefaultValue(InputGestureTextProperty)) &&
((command = item.Command as RoutedCommand) != null))
{
InputGestureCollection inputGestures = command.InputGestures;
// Get appropriate gesture....
}
return value;
}
有類似的代碼,來強迫基於所述電流指令Header屬性,但在這種情況下,它尋找RoutedUICommand
。這告訴我們,這些命令必須是RoutedCommand
/RoutedUICommand
的一個實例,以利用MenuItem
的這一功能。
綜觀反射RoutedCommand
,沒有創造一個DelegateCommand
從RoutedCommand
得出一個簡單的方法,因爲它是CanExecute
/Execute
方法不是虛擬的。
我們可以編寫類似:
public class DelegateCommand : RoutedCommand, ICommand
{
bool ICommand.CanExecute(object parameter) {
// Insert delegate can execute logic
}
void ICommand.Execute(object parameter) {
// Insert delegate execute logic
}
}
但是,這並不妨礙在RoutedCommand
非顯式CanExecute
/Execute
方法被調用。這可能是也可能不是問題。
或者,我們可以創建一個自定義MenuItem
,它足夠聰明,可以查找我們的DelegateCommand(或其他地方)並使用它的文本/手勢。
public class MyMenuItem : MenuItem {
static MyMenuItem() {
InputGestureTextProperty.OverrideMetadata(typeof(MyMenuItem),
new FrameworkPropertyMetadata(string.Empty, null, CoerceInputGestureText));
}
private static object CoerceInputGestureText(DependencyObject d, object value) {
MenuItem item = (MenuItem)d;
var command = item as DelegateCommand;
if ((string.IsNullOrEmpty((string)value) &&
DependencyPropertyHelper.GetValueSource(item, InputGestureTextProperty).BaseValueSource == BaseValueSource.Default &&
command != null) {
InputGestureCollection inputGestures = command.InputGestures;
// Get appropriate gesture....
}
// Call MenuItem Coerce
var coerce = InputGestureTextProperty.GetMetadata(typeof(MenuItem)).CoerceValueCallback;
return coerce(d, value);
}
}
我遇到過這個問題,但並不重要。我想過使用某種附加的屬性用法,將ICommand和手勢聯繫起來。請讓我知道你在這個問題上的進展。 – 2012-02-03 16:27:03