【问题标题】:WPF binding with PlacementTarget and RelativeSourceWPF 与 PlacementTarget 和 RelativeSource 绑定
【发布时间】:2011-06-28 14:18:07
【问题描述】:

你能解释一下下面的 WPF 代码吗:

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

我觉得这非常令人困惑。什么是展示位置目标,什么是相对来源?

【问题讨论】:

    标签: wpf binding datacontext


    【解决方案1】:

    这是将一个事物(UI 控件?需要查看更多代码 sn-p)的 DataContext 绑定到它自己的 PlacementTarget 属性值。

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

    【讨论】:

      【解决方案2】:

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

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

      查看来自 (Gishu +1) 的帖子,了解有关机制的说明。

      【讨论】:

        【解决方案3】:

        每个FrameworkElement 都有一个DataContext,它是一个任意对象。数据绑定的默认来源是 DataContext。您可以使用RelativeSource.Self 将绑定源更改为FrameworkElement 本身而不是DataContext。所以RelativeSource 部分只是将您从FrameworkElementDataContext 移动到FrameworkElement 本身。一旦您位于FrameworkElement,您就可以指定其任何属性的路径。如果FrameworkElementPopup,它将有一个PlacementTarget 属性,该属性是Popup 相对定位的另一个FrameworkElement

        简而言之,如果您有一个相对于TextBoxPopup,则该表达式会将PopupDataContext 设置为TextBox,结果{Binding Text}Popup 的正文将绑定到 TextBox 的文本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多