在下图中,为什么需要 FindAncestor,为什么 AncestorType 不是 UserControl?
如果 UserControl 在 StackPanel 中,那么 AncestorType 会是 StackPanel 吗?
换句话说,父控件与绑定到 viewmodel.Message 有什么关系?为什么绑定中需要所有其他 xaml?
它不需要指定 AncestorType=UserControl,因为这是默认上下文。如果省略“RelativeSource”参数,它将绑定到本地 DataContext。
在这种情况下,UserControl 和它所在的 Window 必须具有不同的 DataContext。由于 UserControl 在设计时通常不知道其父级的名称,因此您至少通常可以假设它只会位于单个窗口中,并使用所示的 RelativeSource 创建到窗口的 DataContext 的绑定。
这可能很常见,因为在应用程序中,Window 可能有一个 DataContext 用于有关整个应用程序的信息,但当前的 UserControl 可能专注于特定的数据片段(例如 Employee)。在这种情况下,所有默认绑定都指向 Employee,但 UserControl 可能也希望绑定到父 DataContext 中的某些内容。
为什么需要 FindAncestor?
这里FindAncestor用于访问Window对象以获取Window对象的DataContext。
为什么 AncestorType 不是 UserControl?
因为UserControl对象的DataContext可能和Window对象的DataContext不一样。
通常它是相同的,但您可以重新定义它。
如果 UserControl 在 StackPanel 中,那么 AncestorType 会是 StackPanel 吗?
如果 StackPanel 本身在您的窗口中,则否。
不要忘记你的目标是包含你想要的 DataContext 的图形对象的类型。
在这种情况下,开发人员只知道具有他们正在寻找的数据上下文的对象是一个窗口。例如,如果在堆栈面板上设置了数据上下文,并且您想要从该数据上下文中获取某些内容,那么您将使用 AncestorType = Window。由于有两个数据上下文,并且用户希望将某些内容绑定到外部,因此使用了 FindAncestor。