何时使用FindAncestor?

时间:2012-06-01 15:46:36

标签: c# .net wpf c#-4.0

在下图中,为什么需要FindAncestor,为什么AncestorType不是UserControl?

如果UserControl在StackPanel内,AncestorType会不会是StackPanel?

换句话说,父控件与绑定到viewmodel.Message有什么关系?为什么绑定中需要所有其他xaml?

WPF binding

3 个答案:

答案 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。