昨日ブログを公開したところ、Xamarinの中の先生にElementNameとx:Referenceの違いについて気になる点を教えていただきました。
というわけで、補足となるエントリーを書き起こしておこうかなと。
なお表題のとおり今回はXamarinではなくてWPFのお話です。
まぁ、XamarinにElementNameはないわけですけどw
さて、昨日以下のようなエントリーを投稿しました。
そうしたところ、Xamarinの中の先生に、関連情報を提供いただきました。
@nuits_jp ちょっと気になってざっくり違いを探してみたらこんなのが見つかりましたが https://t.co/dlte52b2Yf 生きたvisualのツリーが無いと機能しないとかなんとか…良くない側面があるような説明であるように見えますね
— Atsushi Eno (@atsushieno) 2016年6月28日
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さんありがとうございました。
いつも貴重なアドバイスは情報ありがとうございます!
以上です。
それではまた!