您能解释一下以下的WPF代码:
DataContext="{Binding Path=PlacementTarget,RelativeSource={x:Static RelativeSource.Self}}">
我发现它非常令人困惑。什么是展示位置目标以及什么是相对来源?
答案 0 :(得分:12)
这看起来像是用于弹出元素的黑客,例如ContextMenus
和Popup
- 窗口。
这些元素的问题是,它们与窗口的可视树断开连接。因此DataContext
不可用。 PlacementTarget
是指向可视树元素的链接
大多数情况下,您会找到一个绑定绑定路径,如PlacementTarget.Tag
,其中在源元素中Tag
属性已设置为DataContext
,但在某些情况下,元素本身也是有意义的,例如在你的例子中。
假设上述代码用于ToolTip
或ContextMenu
,DataContext
将设置为“拥有”该元素的控件。
查看(Gishu +1)的帖子,了解机制的解释。
答案 1 :(得分:8)
每个FrameworkElement
都有一个DataContext
,它是一个任意对象。数据绑定的默认源是DataContext
。您可以使用RelativeSource.Self
将绑定的来源更改为FrameworkElement
本身而不是DataContext
。因此,RelativeSource
部分只会将您从DataContext
的{{1}}“升级到”FrameworkElement
本身。进入FrameworkElement
后,您可以指定其任何属性的路径。如果FrameworkElement
是FrameworkElement
,则它将具有Popup
属性,该属性是PlacementTarget
相对于其定位的另一个FrameworkElement
。
简而言之,如果您相对于Popup
放置了Popup
,那么该表达式会将TextBox
的{{1}}设置为DataContext
因此,Popup
正文中某处的TextBox
将绑定到{Binding Text}
的文本。
答案 2 :(得分:5)
这是将事物的DataContext(UI Control?需要查看更多代码片段)绑定到其自己的PlacementTarget属性值。
RelativeSource用于指示相对于绑定目标的源对象。 path属性指示源对象上的属性的名称。