ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

コントロールをまたいでコマンドを送りたいんです、送れました!

やりたかったこと

あるコントロールAは、構成要素として別のコントロールBを持っています。そのコントロールBの構成要素から、AのDataContextが持っているコマンドを送りつけよう、という魂胆です。
いや、DataContextって継承されるじゃん。まああそれはもっともなんですが、今回はこういう感じにリストのアイテムだったとき。これではその手はとれませんね。実際には2~3層ほど入れ子になった状態になっているので、ElementNameつけてバインド、というのもなしです。では小分けなどせずに…というのはもっとなしです。ひとつのファイルにたくさん詰め込むのは嫌なんですよ…
f:id:yuu_xxxx:20140215220904p:plain

とりあえず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」と打つと出てくるスニペットを使っています。