課題の背景
WPFで、ボタンの派生クラスを作っています。
そのボタンのDataContextには、自身のViewModelが設定されています。
そのボタンのCommandにバインドしたコマンドの引数に、そのボタンの親コントロールのDataContextを渡したいです。
問題解決の方針として、できればコードビハインドでの実装を避けたいです。
課題
以下のようにしてCommandParameterにバインドを行ってみたのですが、コマンドのExecute()の引数にはnullが渡されてしまいます。
xml
1<Button x:Class="Sample.MyButton" 2 (xmlnsは略) 3 Command={Binding MyCommand} 4 CommandParameter="{Binding Parent.DataContext, 5 RelativeSource={RelativeSource Mode=Self}}" 6 />
コードビハインドを使わずにParent.DataContextを得る良い方法はないでしょうか?
やってみたこと
Microsoft.Xaml.Behaviors.Wpfを使ってLoadedイベントにて取得する際は、nullではありません。
xml
1(略) 2 xmlns:bh="http://schemas.microsoft.com/xaml/behaviors" 3(略) 4 <bh:Interaction.Triggers> 5 <bh:EventTrigger EventName="Loaded"> 6 <bh:InvokeCommandAction 7 Command="{Binding SettingParentViewModelCommand}" 8 CommandParameter="{Binding Parent.DataContext, 9 RelativeSource={RelativeSource 10 Mode=FindAncestor, 11 AncestorType=local:MyButton, 12 AncestorLevel=1}}" 13 /> 14 </bh:EventTrigger> 15</bh:Interaction.Triggers>
これなら一応実現はできているのですが、下記の理由から微妙だなぁと思っています:
- 本来実行したいコマンドとは別のコマンドでViewModelのフィールドにキャッシュすることになるので、コードの意図が読んでいて若干わかりづらい
- コマンド実行しないときでも必ず実行される点が嬉しくない
DataContextは依存関係プロパティではなくて、かつCommandParameterのバインディングが行われるタイミングがコマンド起動時ではなくDataContextChangedの時なのでしょうかね。。。
環境
Visual Studio Professional 2022 ver.17.0.6
.NET 6.0.2
Microsoft.Xaml.Behaviors.Wpf 1.1.39

回答1件
あなたの回答
tips
プレビュー