私はこれをかなり長い間追跡しようとしてきましたが、完全な空白を描いているので、他の人が見るかもしれない何かが欠けているのでしょうか? 注: 現在、これは 1 つの QA マシンでのみ見られるため、通常のようにデバッグできないのはなぜですか?
この記事の最後に実装されているJosh Smith のコード プロジェクトのコマンド グループ コードを使用しています。CommandReference
問題は、にバインドされているボタンCommandGroup
が無効になっていることですが、他の 2 つのボタンは無効になっています。CommandGroup
このボタンは、他の 2 つのボタンを連結しただけであることに注意してください。したがって、両方が有効になっている場合は、CommandGroup
ボタンも有効にする必要があります。だから、私はこれが、CommandGroup
またはCommandReference
...任意のアイデアが役立つことに関係していると推測しています。
私の現在の作業仮説は、通常のRoutedUICommand に対してApplicationCommands.Close
として扱われることが問題であるというものです。特に、直接呼び出すことで、同じコマンドにバインドされた 2 つのボタンの間に不均衡を作成できるためです。しかし、これを解決する方法がわかりません...ICommand
CommandGroup
ApplicationCommands.Close.CanExecute(null)
RoutedCommand
は....なしで呼び出された場合にCanExecute
これを使用します。FilterInputElement(Keyboard.FocusedElement)
CanExecute
IInputElement
ApplicationCommands.Close
コマンドグループ
<Button Content="OK" IsDefault="True">
<Button.Resources>
<commonCommands:CommandReference x:Key="SaveCommand" Command="{Binding SaveDeviceCommand}"/>
</Button.Resources>
<Button.Command>
<commonCommands:CommandGroup>
<commonCommands:CommandGroup.Commands>
<commonCommands:CommandReference Command="{StaticResource SaveCommand}"/>
<x:Static Member="ApplicationCommands.Close"/>
</commonCommands:CommandGroup.Commands>
</commonCommands:CommandGroup>
</Button.Command>
</Button>
<Button Content="Cancel" Command="ApplicationCommands.Close" IsCancel="True"/>
<Button Content="Apply" Command="{Binding SaveDeviceCommand}"/>
コマンドリファレンス:
public class CommandReference : Freezable, ICommand
{
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof (ICommand), typeof (CommandReference), new PropertyMetadata(OnCommandChanged));
public ICommand Command
{
get { return (ICommand) GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
#region ICommand Members
public bool CanExecute(object parameter)
{
return Command != null && Command.CanExecute(parameter);
}
public void Execute(object parameter)
{
Command.Execute(parameter);
}
public event EventHandler CanExecuteChanged;
private static void OnCommandChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
var commandReference = dependencyObject as CommandReference;
if (commandReference == null) return;
var oldCommand = eventArgs.OldValue as ICommand;
var newCommand = eventArgs.NewValue as ICommand;
if (oldCommand != null)
oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;
if (newCommand != null)
newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;
}
#endregion
#region Freezable
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
#endregion
}