Code for final

ふぁいなる向けのコード置き場です。すでにコードじゃないこともいっぱい。

XAMLで子から親の要素を取得する。

WPFを書いていると親の要素を取得したいときがくると思います。

その場合のやり方を書きます。

コードを書いたほうがわかりやすいので以下に書きます。
以下のコードはTextBlockに親であるWindowの幅をテキスト表示しています。

<Window x:Class="LivetWPFApplication1.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=ActualWidth}" />
    </Grid>

</Window>

BindingにRelativeSourceを使うことで、子(TextBlock)から親(Window)のプロパティをバインドできます。
仕組み的には、子の位置からAncestorTypeで指定した型に一致する要素を検索する感じです。

階層が深くなると複数見つかる場合もあると思います。
そういう場合は、AncestorTypeと同列でAncestorLevelを指定すればOKです。 2番目に見つかった要素を取得する場合は、AncestorLevel=2で。
省略したら最初に見つかった要素(AncestorLevel=1)になります。

詳しくはMSDNで。
RelativeSource クラス (System.Windows.Data)

階層が深くなると遅くなりそうな気がしますが、使いドコロはあると思います。
Movselexで使用した例はそのうちあげます。