gpt4 book ai didi

c# - Tag 属性中的 WPF 数据绑定(bind)错误

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:33 26 4
gpt4 key购买 nike

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:son"
x:Class="son.SonWindow">
<Grid x:Name="myGrid">
<Grid.Tag>
<Label Content="{Binding ActualWidth, ElementName=myGrid}" />
</Grid.Tag>
</Grid>
</UserControl>

就像上面的简单代码,但是绑定(bind)找不到Element myGrid。在运行期间,错误显示在输出窗口中

"System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=myGrid'. BindingExpression:Path=ActualWidth; DataItem=null; target element is 'Label' (Name=''); target property is 'Content' (type 'Object')"

我正在使用 Visual Studio 2015 社区版和 .Net Framework 4.5.2。有任何想法吗?提前谢谢你。

最佳答案

元素(其属性绑定(bind))应该是可视化树的一部分,以便可以进行可视化树搜索。将 Binding 与 ElementNameRelativeSource 一起使用时,它会执行一些内部可视化树搜索。但是在您的代码中,Label 通过 Tag 与可视树断开连接。 Label 只是内存中的一个对象,由 Tag 属性引用。

从 .NET 4.0 开始,您可以改用 {x:Reference} 标记,如下所示:

<Grid.Tag>
<Label Content="{Binding ActualWidth, Source={x:Reference myGrid}}" />
</Grid.Tag>

编辑:

如果引用名称指向包含 {x:Reference} 的某个元素,则使用 {x:Reference} 会导致循环依赖问题。在您的情况下,它是 myGrid(包含 {x:Reference})。所以它不能用于你的情况。相反,您需要使用一些代理。这种技术看起来有点hacky,但实际上它非常漂亮。它肯定也适用于任何版本的 .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>

如您所见,Binding 的 Source 设置为 StaticResource,指向 DiscreteObjectKeyFrame。这是一个 Freezable 对象,因此非常有趣的是,无论您使用 ElementName相对来源。因此,我们将其 Value 属性绑定(bind)到 Grid(名称为 myGrid)。稍后我们将 LabelContent 属性绑定(bind)到 Freezable 对象,但将 Path 设置为 Value .ActualWidth(Value指向Grid,所以我们需要追加ActualWidth绑定(bind)到Grid.ActualWidth).

事实上你可以使用任何Freezable对象但是我们使用DiscreteObjectKeyFrame为了方便,它的Value接受所有类型的object

还有另一种技术可以在这种情况下(断开连接的上下文)设置绑定(bind),但它需要您创建自定义 MarkupExtension。它当然更复杂(但一旦您熟悉了 WPF,它仍然足够简单)。

关于c# - Tag 属性中的 WPF 数据绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com