WPF与PlacementTarget和RelativeSource的绑定

时间:2011-02-16 19:00:20

标签: wpf binding datacontext

您能解释一下以下的WPF代码:

DataContext="{Binding Path=PlacementTarget,RelativeSource={x:Static RelativeSource.Self}}">

我发现它非常令人困惑。什么是展示位置目标以及什么是相对来源?

3 个答案:

答案 0 :(得分:12)

这看起来像是用于弹出元素的黑客,例如ContextMenusPopup - 窗口。
这些元素的问题是,它们与窗口的可视树断开连接。因此DataContext不可用。 PlacementTarget是指向可视树元素的链接 大多数情况下,您会找到一个绑定绑定路径,如PlacementTarget.Tag,其中在源元素中Tag属性已设置为DataContext,但在某些情况下,元素本身也是有意义的,例如在你的例子中。

假设上述代码用于ToolTipContextMenuDataContext将设置为“拥有”该元素的控件。

查看(Gishu +1)的帖子,了解机制的解释。

答案 1 :(得分:8)

每个FrameworkElement都有一个DataContext,它是一个任意对象。数据绑定的默认源是DataContext。您可以使用RelativeSource.Self将绑定的来源更改为FrameworkElement本身而不是DataContext。因此,RelativeSource部分只会将您从DataContext的{​​{1}}“升级到”FrameworkElement本身。进入FrameworkElement后,您可以指定其任何属性的路径。如果FrameworkElementFrameworkElement,则它将具有Popup属性,该属性是PlacementTarget相对于其定位的另一个FrameworkElement

简而言之,如果您相对于Popup放置了Popup,那么该表达式会将TextBox的{​​{1}}设置为DataContext因此,Popup正文中某处的TextBox将绑定到{Binding Text}的文本。

答案 2 :(得分:5)

这是将事物的DataContext(UI Control?需要查看更多代码片段)绑定到其自己的PlacementTarget属性值。

RelativeSource用于指示相对于绑定目标的源对象。 path属性指示源对象上的属性的名称。