如何在标签上设置目标属性?

21

以下代码:

    <TextBlock Name="foo"></TextBlock>
    <Label Target="foo">_Delta pressure</Label>
生成以下设计时错误:

Error 1 Value 'foo' cannot be assigned to property 'Target'. Property 'Target' of type 'UIElement' cannot be specified as a string. C:\Programming\WpfCustomPlot\SPT.Olga.Plot.Custom\PumpCurves\View\RatedValuesView.xaml 65 45 SPT.Olga.Plot.Custom

并且出现以下运行时错误:

'UIElement' type does not have a public TypeConverter class. Error at Line 65 Position 45.

我做错了什么?
2个回答

39

Target 属性接受的是元素本身而不是字符串,所以你需要:

<TextBlock Name="foo"></TextBlock>
<Label Target="{Binding ElementName=foo}">_Delta pressure</Label>

如果所有这些控件都在DataTemplate中(例如在ItemsControl内部),那该怎么办? - Uri London

5
在.NET Framework 4.0版本中,似乎更改了此属性,以便它可以仅接受元素名称作为字符串。这是通过使用TypeConverterAttribute将Label.Target属性装饰为NameReferenceConverter来完成的,以处理从String到UIElement的转换。
请查看以下文档以获取更多信息:

https://msdn.microsoft.com/en-us/library/system.windows.controls.label.target(v=vs.100).aspx

https://msdn.microsoft.com/en-us/library/system.windows.markup.namereferenceconverter(v=vs.100).aspx

PS: 一般认为在XAML中使用x:Name属性指定元素名称比使用Name属性更好。


似乎可以工作,但在XAML编辑器中会出现警告。 - Romano Zumbé
@RomanoZumbé 这是在 XAML 中设置 WPF Label 的 Target 属性时出现的错误吗?这似乎与此无关。 - CptRobby
有趣。在通过上面链接的文档进行搜索后,我发现NameReferenceConverter使用服务提供程序来解析名称,并将该提供程序(类型为ITypeDescriptorContext)称为“上下文”。服务提供程序是内部的,应由XAML编辑器中的XAML处理器提供。您可以在此处阅读更多信息:https://learn.microsoft.com/en-us/dotnet/framework/xaml-services/service-contexts-available-to-type-converters-and-markup-extensions - CptRobby
至于为什么在你的情况下它不能正常工作,我不知道。我建议尝试将你的Target更改为"{Binding ElementName=lstDirectories}",看看是否会出现相同的错误。如果没有,请尝试运行你的项目,并确保它能够正确使用你的访问密钥等。然后再尝试将其改回"lstDirectories",看看是否仍然会出现错误。如果是这样,我建议放弃并使用绑定语法。祝好运!;) - CptRobby
我已经做了所有的事情,绑定语法没有任何警告。但是使用转换器语法时,无论我做什么都会出现警告。我认为这更像是一个学术问题。我将只使用绑定语法。但总是有趣尝试并找出问题所在;-) - Romano Zumbé
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接