FreezableにDataContextが伝播する仕掛け(その1)
依存関係プロパティ(継承タイプ)を変更しますと。
このあたりをスタート地点としまして。
http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyObject.cs,1243
長い処理を経てここに到達します。
http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyObject.cs,869
DependencyObject内にFreezableのために特別な処理が入っています。
具体的には継承する依存関係プロパティは、下位のFreezableなDependencyObjectに伝播するという仕掛けの様子。
継承する依存関係プロパティという概念は FrameworkElementからのはずですが、
ここでは、それとは別の継承関係に関する情報です。
http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyObject.cs,2786
FrameworkElementの中にFreezableがあるとDataContextがFreezableから参照できて、Bindingできるメカニズムが長いこと謎と言われていた気がするのですが、実はDependencyObjectのなかに何やらあった模様です。Microsoftは資料は出してないけど、リファレンスコードにはそれなりのヒントがあるっぽいです。
ただ、これで正解かは実際に動かしてないのでちょっと確認不足です。
Binding自体はFreezableはDependencyObjectを継承しているから特に問題はないはずですし、自分に届いたコンテキストのリストはFreezableにありますので、そこから欲しい値を取ってきてBindingしているのです。
・・・のだと思うのですが、やっぱりもう少し調べる必要はありそうです。
Binding.csのリファレンスコードあたりをよく読めば、多分このあたりの問題は解消できそうです。
今日は考えかけなので、また今度掘り下げますね。
いずれにしても、仕組みがわからないから放置は良くありません。