コントロールをまたいでコマンドを送りたいんです、送れました!
やりたかったこと
あるコントロールAは、構成要素として別のコントロールBを持っています。そのコントロールBの構成要素から、AのDataContextが持っているコマンドを送りつけよう、という魂胆です。
いや、DataContextって継承されるじゃん。まああそれはもっともなんですが、今回はこういう感じにリストのアイテムだったとき。これではその手はとれませんね。実際には2~3層ほど入れ子になった状態になっているので、ElementNameつけてバインド、というのもなしです。では小分けなどせずに…というのはもっとなしです。ひとつのファイルにたくさん詰め込むのは嫌なんですよ…
とりあえずDynamicResourceかなー?
「DynamicResourceでAを参照してDataContextのプロパティバインドすればいけるのでは?」と思ってやってみるとあたりでした。ただ、今回はAがWindowだったからよかったものの、ほかのコントロールだとどうなっていたかわかりません。
<Button Command="{Binding DataContext.MyCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" CommandParameter="{Binding Parameter}"/>
バインドさせるところだけ抜き出すとこんな感じです。ViewModelのほうにも
#region MyCommand private ViewModelCommand _MyCommand; public ViewModelCommand MyCommand { get { if (_MyCommand == null) { _MyCommand = new ViewModelCommand(My); } return _MyCommand; } } public void My() { //なんかかく } #endregion
とこんな感じで実装しておきます。これで大丈夫のはずです。ちなみにコード側のサンプルはLivetで「lcomn」と打つと出てくるスニペットを使っています。