リフレクタでMenuItem
を見ると、私たちはの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
が検索されます。これは、MenuItem
のこの機能を利用するために、コマンドがRoutedCommand
/のインスタンスでなければならないことを示しています。それは方法が仮想ではありませんCanExecute
/Execute
だからリフレクタでRoutedCommand
を見ると
は、RoutedCommand
から派生DelegateCommand
を作成する簡単な方法は、ありません。
私たちのようなものコーディングできます
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
方法を防ぐことはできません。どちらが問題になるかもしれない。
また、DelegateCommand(または他の場所)を検索してテキスト/ジェスチャを使用するのに十分なスマートなカスタムMenuItem
を作成することもできます。
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とジェスチャーをリンクする、何らかの種類の添付プロパティの使用を考えました。この問題についての進捗状況を教えてください。 –