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