WPF - TextBlock 中超链接的数据模板/值转换器
-
03-07-2019 - |
题
我有一个列表框,显示人员姓名、电子邮件、部门等的列表。有一个 DataTemplate,它有几个 TextBlocks 来显示每个属性。其中一个文本块正在包装一个超链接以显示电子邮件地址,如下所示:
<TextBlock>
<Hyperlink NavigateUri="{Binding Email}">
<TextBlock Text="{Binding Email}" />
</Hyperlink>
</TextBlock>
这工作正常,但如果该人没有电子邮件地址,则 TextBlock 不会自动折叠。所以我编写了一个值转换器并以如下方式使用(简化):
string s = (String) value;
if (s == ""){
return Visibility.Collapsed;
}
return Visibility.Visible;
这是使用 ValueConverter 的样式:
<Style x:Key="ResultItemTextBoxStyle">
<Setter Property="TextBlock.Visibility" Value="{Binding Path=Text, RelativeSource={RelativeSource Self},
Converter={StaticResource StringToVisibilityConverter}}"/>
</Style>
我将调用转换器的样式添加到 TextBlock 中:
<TextBlock Style="{StaticResource ResultItemTextBoxStyle}">
<Hyperlink NavigateUri="{Binding Email}">
<TextBlock Text="{Binding Email}" />
</Hyperlink>
</TextBlock>
进行此更改后,电子邮件地址将不再显示 - 在值转换器中,TextBlock 的文本始终为空,并且返回 Visibility.Collapsed。就像它在加载超链接或其他东西之前评估 TextBlock 的文本一样......
请帮我解决这个问题。
谢谢!
解决方案
您编写的转换器将 TextBlock
的 Text
与空白进行比较,而不是内部 Hyperlink
的文本。我想你真的想将 RelativeSource
设置为子 Hyperlink
,但我认为不可能。
你确定 TextBlock
的大小不会崩溃吗?如果你把样式放在 Hyperlink
上(甚至是它的内部 TextBlock
),那么这可能仍然有用吗?
编辑: Hyperlink
没有 Visibility
属性,所以不幸的是,将样式移动到它不会有帮助。我能想到的唯一其他选项是创建一个派生自 TextBlock
的自定义控件,它包含 Hyperlink
和 TextBlock
。如果向其添加 Email
DependencyProperty
,则可以使用它来确定控件是否可见,以及 Hyperlink <的值/ code>及其内部
TextBlock
。
似乎应该有更好的方法来解决这个问题,但我现在无法想到任何事情。
其他提示
我会做这样的事情:
<TextBlock>
<TextBlock.Style>
<Style>
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Email}" Value="">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
<Hyperlink NavigateUri="{Binding Email}">
<TextBlock Text="{Binding Email}" />
</Hyperlink>
</TextBlock>
我认为编写一个价值转换器是过度的(没有违法行为)。
我知道这不完全是你的问题,但你为什么要使用文本块?
只需使用
<Hyperlink NavigateUri="{Binding Email}" Content="{Binding Email}"
Visibility="{Binding Email, Converter={StaticResource StringToVisibilityConverter}}" />
应该做你想做的事,除非我弄错了。
更新:好吧,我错了,WPF Hyperlink 不是 Silverlight 的 HyperlinkButton,并且没有 Content 属性。我真丢脸。