该元素(其属性已绑定)应该是可视化树的一部分,以便可以完成可视化树搜索。当使用绑定时ElementName
or RelativeSource
,它执行一些内部可视化树搜索。但在你的代码中Label
通过以下方式与可视树断开连接Tag
. Label
只是内存中的一个对象,由 Tag 属性引用。
从 .NET 4.0 开始,您可以使用{x:Reference}
而是使用标记,如下所示:
<Grid.Tag>
<Label Content="{Binding ActualWidth, Source={x:Reference myGrid}}" />
</Grid.Tag>
Edit:
Using {x:Reference}
如果引用名称指向某个包含以下元素的元素,则可能会导致循环依赖问题{x:Reference}
。在你的情况下是myGrid
(含{x:Reference}
)。所以它不能用于你的情况。相反,您需要使用一些代理。这个技术看起来有点老套,但实际上非常漂亮。它也肯定适用于任何版本的 .NET(支持 WPF):
<Grid x:Name="myGrid">
<Grid.Resources>
<DiscreteObjectKeyFrame x:Key="proxy" Value="{Binding ElementName=myGrid}"/>
</Grid.Resources>
<Grid.Tag>
<Label Content="{Binding Value.ActualWidth, Source={StaticResource proxy}}" />
</Grid.Tag>
</Grid>
如您所见,绑定与其一起工作Source
set to StaticResource
指向一个DiscreteObjectKeyFrame
。这是一个Freezable
对象,因此非常有趣的是,为 a 的任何 DependencyProperty 设置的所有绑定Freezable
无论你使用什么,对象都能正常工作ElementName
or RelativeSource
。所以我们绑定它的Value
财产给Grid
(姓名为myGrid
)。稍后我们绑定Content
的财产Label
to the Freezable
对象但与Path
set to Value.ActualWidth
(Value
指着Grid
,所以我们需要附加ActualWidth
将其绑定到Grid.ActualWidth
).
事实上你可以使用任何Freezable
对象但我们使用DiscreteObjectKeyFrame
为了方便起见,其Value
接受各种object
.
还有另一种技术可以在这种情况下设置绑定(断开上下文),但它需要您创建一个自定义MarkupExtension
。它当然更复杂(但一旦您熟悉 WPF,仍然足够简单)。