私が抱えている問題を単純化するために、この架空のシナリオを考えてみましょう。
コントロールの XAML で、1TreeView
つと 2 つの固定ルートTreeViewItem
ノード 'AItemsNode' と 'BItemsNode' を定義しました。その ViewModel で、AItems と BItems という 2 つの子コレクションを公開します。次に、各ルート ノードの ItemsSource プロパティを ViewModel のそれぞれのコレクションにバインドします。これはうまく機能し、私が望むものを正確に表示します。
次に、ApplicationCommands.Open の CommandBinding を2 つのルート ノードの子TreeViewItem ノードに追加します。具体的には、ルート 'AItemsNode' の下の子の 'Open' CommandBinding が 'OpenAItem_Executed' を指し、2 番目のルート ノードの子が 'OpenBItem_Executed' を指すようにします。
私が抱えている問題は、TreeViewItem オブジェクト自体に CommandBindings を設定する方法がわからないことです。XAML を介してこれをまったく理解することはできません。コード ビハインドでそれを行う場合は、ItemContainerGenerator と統合し、生成されているものを調べてバインディングを追加する必要があり、基本的に非常に多くのコードを記述します。 「Open」CommandBinding を TreeView 自体に追加し、SelectedObject を検査してそこから移動することもできます。データ型に基づいてあらゆる場所で委任する単一の Open_Executed ハンドラーがあるため、最適ではありませんが、機能します!
それでも、生成された TreeViewItem に CommandBinding を直接追加してそれを回避し、コードをよりきれいに分離する方法を誰かが教えてくれることを願っています。
では、TreeViewItem のスタイル (または XAML の他の方法) を介して特定の CommandBindings を適用するにはどうすればよいでしょうか?