WPF与PlacementTarget和RelativeSource的绑定

Mad*_*Seb 9 wpf datacontext binding

你能解释下面的WPF代码:

DataContext="{Binding Path=PlacementTarget,RelativeSource={x:Static RelativeSource.Self}}">
Run Code Online (Sandbox Code Playgroud)

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

HCL*_*HCL 14

这看起来像一个用于弹出元素,如黑客ContextMenusPopup-Windows.
这些元素的问题是,它们与窗口的可视树断开连接.因此DataContext无法使用.这PlacementTarget是一个指向可视树元素的链接.
大多数情况下,你会发现一个绑定绑定路径,就像PlacementTarget.Tag在source元素中将Tag属性设置为的那样,DataContext但在某些情况下,元素本身也是有意义的,例如在你的例子中.

假设上面的代码用在a ToolTip或a中ContextMenu,DataContext则将设置为"拥有"该元素的控件.

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


Ric*_*key 9

每个FrameworkElement都有一个DataContext任意对象.数据绑定的默认源是DataContext.您可以使用RelativeSource.Self更改绑定到FrameworkElement自身而不是其自身的源DataContext.因此,RelativeSource部分只是移动你"上一级"从DataContextFrameworkElementFrameworkElement自己.到达目的地后,FrameworkElement您可以指定其任何属性的路径.如果FrameworkElementPopup,它将有一个PlacementTarget属性,它是其他FrameworkElementPopup相对于定位.

总之,如果你有一个Popup放置相对于TextBox例如,表达设置DataContextPopupTextBox并且作为结果{Binding Text}某处的身体Popup将结合的文本TextBox.


Gis*_*shu 6

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

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