在下图中,为什么需要FindAncestor,为什么AncestorType不需要UserControl?
如果UserControl在StackPanel中,AncestorType会是StackPanel吗?
换句话说,父控件与绑定到viewmodel.Message有什么关系?为什么绑定中需要所有其他xaml?

发布于 2012-06-01 23:58:45
它不需要指定AncestorType=UserControl,因为这是默认的上下文。如果省略"RelativeSource“参数,它将绑定到本地DataContext。
在这种情况下,UserControl和它所在的窗口必须具有不同的DataContexts。由于UserControl在设计时通常不知道其父窗口的名称,因此至少通常可以假定它只在单个窗口中,并使用RelativeSource创建到窗口的DataContext的绑定,如下所示。
这是很常见的,因为在应用程序中,窗口可能有一个DataContext来显示关于整个应用程序的信息,但是当前的UserControl可能集中在特定的数据段(比如员工)上。在本例中,所有默认绑定都指向Employee,但是UserControl可能也希望绑定到父DataContext中的某些内容。
发布于 2012-06-02 00:02:15
为什么需要FindAncestor?
这里使用FindAncestor来访问Window对象,以获得对Window对象的DataContext的访问。
为什么UserControl不是AncestorType?
因为UserControl对象的DataContext可能与Window对象的DataContext不同。
通常它是一样的,但是你可以重新定义它。
如果UserControl在StackPanel中,AncestorType会是StackPanel吗?
如果StackPanel本身在您的窗口中,则为否。
不要忘记,您的目标是包含所需DataContext的图形对象的类型。
发布于 2012-06-01 23:54:07
在这种情况下,开发人员只知道包含他们要查找的数据上下文的对象是一个窗口。例如,如果在堆栈面板上设置了一个数据上下文,并且您想要该数据上下文中的内容,那么您将使用AncestorType =窗口。由于有两个数据上下文,并且用户希望将某些内容绑定到外部,因此使用了FindAncestor。
https://stackoverflow.com/questions/10853438
复制相似问题