nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

WPFのBindingのElementNameとx:Referenceの違いについて教わりました

昨日ブログを公開したところ、Xamarinの中の先生にElementNameとx:Referenceの違いについて気になる点を教えていただきました。
というわけで、補足となるエントリーを書き起こしておこうかなと。
なお表題のとおり今回はXamarinではなくてWPFのお話です。
まぁ、XamarinにElementNameはないわけですけどw

さて、昨日以下のようなエントリーを投稿しました。

nuits.hatenadiary.jp

そうしたところ、Xamarinの中の先生に、関連情報を提供いただきました。

StackOverflowの中身を要約すると以下のような意味合いだそうです。

x:Referenceの場合

ElementNameの場合

  • 指定された名称のオブジェクトを探索する
  • 探索する際、VisualTreeを上下に探索するため、VisualTreeの親子関係にない場所にあると見つからない
  • そのため、有効なVisualTreeが常に必要である

気になるのは3つ目で、原文がいかのとおりです。

Therefore a functional VisualTree is always needed.

ここでいっている「functional VisualTree」とやらが何を指しているのかはっきりしないのですが、ちょっと不安な言い回しですね。

ちなみにVisualTreeの探索が云々については、非常にわかりやすい例が紹介されていました。

<StackPanel>
 <Button x:name="bttn1" Visibility="Hidden">Click me</Button>
 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn x:Name="column1"/>

上のような構造があった場合、bttn1はcolumn1の直接的な親子関係にありません。
そのため、column1からx:Referenceでは参照可能(スコープがWindow全体なので)ですが、ElementNameでは参照できません。

こうかくとElementNameのいいところがないように見えますが、StackOverflowでもそこまで明確に言及されているわけではないので、あくまで参考までとしていただき、最終的にどうするかはご自身で判断ください。
ちなみに、昨日のエントリーでも触れましたが、そもそもちゃんとMVVMな設計になっていれば、アプリ開発の範囲では何れもあまり出番はないかもしれませんが。

というわけで、最後にもう一度、@atsushienoさんありがとうございました。
いつも貴重なアドバイスは情報ありがとうございます!

以上です。
それではまた!