下の画像で、FindAncestor が必要な理由と、AncestorType が UserControl ではない理由を教えてください。
UserControl が StackPanel 内にある場合、AncestorType は StackPanel になりますか?
つまり、親コントロールは、viewmodel.Message へのバインディングとどのような関係があるのでしょうか? バインディングで他のすべての xaml が必要なのはなぜですか?
これがデフォルトのコンテキストであるため、AncestorType=UserControlを指定する必要はありません。「RelativeSource」パラメーターを省略すると、ローカルのDataContextにバインドされます。
この場合、UserControlとそれに含まれるウィンドウは異なるDataContextを持っている必要があります。UserControlは通常、設計時にその親の名前を知らないため、少なくとも通常は、単一のウィンドウにのみ存在すると想定し、示されているように、RelativeSourceを使用してウィンドウのDataContextへのバインディングを作成できます。
これは一般的な場合があります。アプリケーションでは、ウィンドウにアプリケーション全体に関する情報のDataContextが含まれている場合がありますが、現在のUserControlは特定のデータ(従業員など)に焦点を合わせている場合があります。この場合、すべてのデフォルトのバインディングはEmployeeを指しますが、UserControlは親のDataContext内の何かにもバインドしたい場合があります。
FindAncestor が必要な理由
ここでは、FindAncestor を使用して Window オブジェクトにアクセスし、Window オブジェクトの DataContext へのアクセスを取得します。
AncestorType が UserControl ではないのはなぜですか?
UserControl オブジェクトの DataContext は、Window オブジェクトの DataContext と同じではない可能性があるためです。
通常は同じですが、再定義できます。
UserControl が StackPanel 内にある場合、AncestorType は StackPanel になりますか?
StackPanel 自体がウィンドウ内にある場合は、いいえ。
必要な DataContext を含むグラフィカル オブジェクトの Type をターゲットにすることを忘れないでください。
この場合、開発者は、探しているデータコンテキストを持つオブジェクトがウィンドウであることを知っていました。たとえば、データコンテキストがスタックパネルに設定されていて、そのデータコンテキストから何かが必要な場合は、AncestorType=Windowを使用します。2つのデータコンテキストがあり、ユーザーが何かを外部のものにバインドしたいので、FindAncestorが使用されました。