0

私はこれをかなり長い間追跡しようとしてきましたが、完全な空白を描いているので、他の人が見るかもしれない何かが欠けているのでしょうか? 注: 現在、これは 1 つの QA マシンでのみ見られるため、通常のようにデバッグできないのはなぜですか?

この記事の最後に実装されているJosh Smith のコード プロジェクトのコマンド グループ コードを使用しています。CommandReference

問題は、にバインドされているボタンCommandGroupが無効になっていることですが、他の 2 つのボタンは無効になっています。CommandGroupこのボタンは、他の 2 つのボタンを連結しただけであることに注意してください。したがって、両方が有効になっている場合は、CommandGroupボタンも有効にする必要があります。だから、私はこれが、CommandGroupまたはCommandReference...任意のアイデアが役立つことに関係していると推測しています。

私の現在の作業仮説は、通常のRoutedUICommand に対してApplicationCommands.Closeとして扱われることが問題であるというものです。特に、直接呼び出すことで、同じコマンドにバインドされた 2 つのボタンの間に不均衡を作成できるためです。しかし、これを解決する方法がわかりません...ICommandCommandGroupApplicationCommands.Close.CanExecute(null)

RoutedCommandは....なしで呼び出された場合にCanExecuteこれを使用します。FilterInputElement(Keyboard.FocusedElement)CanExecuteIInputElementApplicationCommands.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
}
4

1 に答える 1