0

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

如果 UserControl 在 StackPanel 中,那么 AncestorType 会是 StackPanel 吗?

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

WPF 绑定

4

3 回答 3

1

它不需要指定 AncestorType=UserControl,因为这是默认上下文。如果省略“RelativeSource”参数,它将绑定到本地 DataContext。

在这种情况下,UserControl 和它所在的 Window 必须具有不同的 DataContext。由于 UserControl 在设计时通常不知道其父级的名称,因此您至少通常可以假设它只会位于单个窗口中,并使用所示的 RelativeSource 创建到窗口的 DataContext 的绑定。

这可能很常见,因为在应用程序中,Window 可能有一个 DataContext 用于有关整个应用程序的信息,但当前的 UserControl 可能专注于特定的数据片段(例如 Employee)。在这种情况下,所有默认绑定都指向 Employee,但 UserControl 可能也希望绑定到父 DataContext 中的某些内容。

于 2012-06-01T15:58:44.810 回答
1

为什么需要 FindAncestor?
这里FindAncestor用于访问Window对象以获取Window对象的DataContext。

为什么 AncestorType 不是 UserControl?
因为UserControl对象的DataContext可能和Window对象的DataContext不一样。
通常它是相同的,但您可以重新定义它。

如果 UserControl 在 StackPanel 中,那么 AncestorType 会是 StackPanel 吗?
如果 StackPanel 本身在您的窗口中,则否。
不要忘记你的目标是包含你想要的 DataContext 的图形对象的类型。

于 2012-06-01T16:02:14.597 回答
0

在这种情况下,开发人员只知道具有他们正在寻找的数据上下文的对象是一个窗口。例如,如果在堆栈面板上设置了数据上下文,并且您想要从该数据上下文中获取某些内容,那么您将使用 AncestorType = Window。由于有两个数据上下文,并且用户希望将某些内容绑定到外部,因此使用了 FindAncestor。

于 2012-06-01T15:54:06.570 回答