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
这看起来像一个用于弹出元素,如黑客ContextMenus和Popup-Windows.
这些元素的问题是,它们与窗口的可视树断开连接.因此DataContext无法使用.这PlacementTarget是一个指向可视树元素的链接.
大多数情况下,你会发现一个绑定绑定路径,就像PlacementTarget.Tag在source元素中将Tag属性设置为的那样,DataContext但在某些情况下,元素本身也是有意义的,例如在你的例子中.
假设上面的代码用在a ToolTip或a中ContextMenu,DataContext则将设置为"拥有"该元素的控件.
查看(Gishu +1)的帖子,了解机制的解释.
每个FrameworkElement都有一个DataContext任意对象.数据绑定的默认源是DataContext.您可以使用RelativeSource.Self更改绑定到FrameworkElement自身而不是其自身的源DataContext.因此,RelativeSource部分只是移动你"上一级"从DataContext的FrameworkElement给FrameworkElement自己.到达目的地后,FrameworkElement您可以指定其任何属性的路径.如果FrameworkElement是Popup,它将有一个PlacementTarget属性,它是其他FrameworkElement的Popup相对于定位.
总之,如果你有一个Popup放置相对于TextBox例如,表达设置DataContext的Popup到TextBox并且作为结果{Binding Text}某处的身体Popup将结合的文本TextBox.
这是将事物的DataContext(UI Control?需要查看更多代码片段)绑定到其自己的PlacementTarget属性值.
RelativeSource用于指示相对于绑定目标的源对象.path属性指示源对象上的属性的名称.