【发布时间】:2011-06-28 14:18:07
【问题描述】:
你能解释一下下面的 WPF 代码吗:
DataContext="{Binding Path=PlacementTarget,RelativeSource={x:Static RelativeSource.Self}}">
我觉得这非常令人困惑。什么是展示位置目标,什么是相对来源?
【问题讨论】:
标签: wpf binding datacontext
你能解释一下下面的 WPF 代码吗:
DataContext="{Binding Path=PlacementTarget,RelativeSource={x:Static RelativeSource.Self}}">
我觉得这非常令人困惑。什么是展示位置目标,什么是相对来源?
【问题讨论】:
标签: wpf binding datacontext
这是将一个事物(UI 控件?需要查看更多代码 sn-p)的 DataContext 绑定到它自己的 PlacementTarget 属性值。
RelativeSource 用于表示相对于绑定目标的源对象。 path 属性指示源对象上的属性名称。
【讨论】:
这看起来像是用于弹出元素的 hack,例如 ContextMenus 和 Popup-windows。
这些元素的问题在于,它们与窗口的可视化树断开了连接。因此DataContext 不可用。 PlacementTarget 是指向可视树元素的链接。
大多数情况下,您会发现像PlacementTarget.Tag 这样的绑定绑定路径,其中源元素中的Tag 属性已设置为DataContext,但在某些情况下,元素本身也是有意义的,例如在您的示例中。
假设上述代码用于ToolTip 或ContextMenu,DataContext 将设置为“拥有”该元素的控件。
查看来自 (Gishu +1) 的帖子,了解有关机制的说明。
【讨论】:
每个FrameworkElement 都有一个DataContext,它是一个任意对象。数据绑定的默认来源是 DataContext。您可以使用RelativeSource.Self 将绑定源更改为FrameworkElement 本身而不是DataContext。所以RelativeSource 部分只是将您从FrameworkElement 的DataContext 移动到FrameworkElement 本身。一旦您位于FrameworkElement,您就可以指定其任何属性的路径。如果FrameworkElement 是Popup,它将有一个PlacementTarget 属性,该属性是Popup 相对定位的另一个FrameworkElement。
简而言之,如果您有一个相对于TextBox 的Popup,则该表达式会将Popup 的DataContext 设置为TextBox,结果{Binding Text} 在Popup 的正文将绑定到 TextBox 的文本。
【讨论】: