0

セットアップは次のとおりです(余分なレイアウトコードは削除されています)。

Window.xaml

<Button Name="btn_Next" Command="NextPage">Next</Button>
<ContentControl Name="contentControl1" >
        <Binding ElementName="MainWindow" Path="CurrentPage"/>
</ContentControl>

Window.xaml.csコンストラクター

  var nextCommand = new CommandBinding(NavigationCommands.NextPage);
  nextCommand.CanExecute += nextCommand_CanExecute;
  nextCommand.Executed += nextCommand_Executed;
  CommandBindings.Add(nextCommand);

nextCommand_CanExecuteこれは、CurrentPageが最後のページであるかどうかをチェックする基本例でうまく機能します。ただし、そのロジックは現在、配列をチェックしているだけであり、線形ナビゲーションでのみ機能します。ただし、ナビゲーションはツリーのようになり、これは機能しません。この場合、内のアイテムがcontentControl1異なる方向に分岐することがあります。CurrentPageですから、をオーバーライドする機会があるユーザーコントロールが欲しいのCanExecuteです。UserControl私の問題は、を開始する方法がわからないことCanExecuteです。CommandTargetいくつかの設定を使用して無駄にしようとしました...私の子コントロールでCanExecuteメソッドがトリガーされることはありません。e.ContinueRouting = true親ウィンドウのCanExecuteでを使用しようとさえしました。これが役立つ場合のユーザーコントロールコードです。

ユーザーコントロールコンストラクター:

  var nextCommand = new CommandBinding(NavigationCommands.NextPage);
  nextCommand.CanExecute += nextCommand_CanExecute;
  CommandBindings.Add(nextCommand);

ユーザーコントロールCanExecuteメソッド:

private void nextCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
  e.CanExecute = false;
  e.Handled = true;
}
4

1 に答える 1

2

ルーティングされたコマンド イベントは、ビジュアル ツリーのルートからそれらを開始したコントロールまでトンネリングし、バブルアップします。ルーティングされたコマンドに関する Josh Smith の記事には、それがどのように機能するかについての良い記事があります (特に「ルーティングされた」セクションを参照してください) http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/

ここでの問題は、ユーザー コントロール (コンテンツ コントロール内) が、コマンドを発行するボタンの "祖先" ではないため、ルーティング イベントが (通過中でも) 到達しないことです。ビジュアル ツリーの構造を考えると、ルーティングされたコマンドだけでは十分ではないと思います。

頭に浮かぶ最初の解決策は、CanExecute/Executed ロジックをユーザー コントロールに委任するための独自のメカニズムを装備することです。おそらく、必要なさまざまなコマンド CanExecute/Executed メソッドを定義する、そのようなすべてのコントロールによって実装される基本クラスまたはインターフェイスを定義できます。次に、現在読み込まれているコントロールをインターフェイス/基本クラスの型としてキャストし、適切なメソッドを呼び出す最上位の実装を作成できます。

于 2012-04-10T17:06:31.510 に答える