2013年12月5日木曜日

RelativeSourceでWPFのBidingをどうやってするの?

元ネタ:How do I use WPF bindings with RelativeSource?

元ネタは教科書通りの回答に留まってますので一応色々と書いて見ようと思います。

ずばり、下記のように書けばWindowのタイトルが取得できるのです。

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Name="WindowName">
    <Grid>
        <TextBlock Text="{Binding Path=Title, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"/>
    </Grid>
</Window>

「ほほぅ」と思った人は気をつけて下さい。
普通はこのケースこんな書き方しませんから。
なぜなら、一番単純なElementBindingを使えば、下記で同じことができます。

<TextBlock Text="{Binding ElementName=WindowName, Path=Title}"/>

じゃあ何なのRelativeSourceいつ使うのって話ですが、
それは、
「同じxaml上に目当てのElementがないとき」
とか
「目当てのElementに名前がつけられないとき」
です。

それってどんなときって話はあるんですが、
とりあえず誰かの書いたxamlで出くわすまで気にしなくていいと思います。

ひとまず、細かいことは覚えない。脳の容量は限られてる。

ElementBindingしたいときに名前つけてBindできなかったら、
RelativeSource使えば、ひとまずxamlでいう親とか遠いご先祖様とはBindできるんだよ。

ってことだけ覚えておけば、後は都度ググればなんとかなると思います。

あとは・・・AncestorTypeにGridなどよく使われるものを指定すると
バグを起こしやすいコードになります。
目的のGridと始点の間にGrid要素いれられたらアウトですから。
まぁそれぐらいかな。

0 件のコメント:

コメントを投稿