我有一个ListBox,显示人名,电子邮件,部门等的列表。有一个DataTemplate,它有几个TextBlocks来显示每个属性。其中一个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的文本或者......
请帮我解决这个问题。
谢谢!
答案 0 :(得分:2)
我会做这样的事情:
<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>
我认为编写一个价值转换器是过度的(没有违法行为)。
答案 1 :(得分:1)
您编写的转换器将Text
的{{1}}与空白进行比较,而不是内部TextBlock
的文本。我想你真的想把Hyperlink
设置为孩子RelativeSource
,但我不认为这是可能的。
你确定Hyperlink
的大小不会崩溃吗?如果您将样式放在TextBlock
上(或者甚至是内部Hyperlink
),那么这可能仍然有用吗?
编辑:TextBlock
没有Hyperlink
属性,因此不幸的是,将样式移到它不会有帮助。我能想到的唯一其他选项是创建一个源自Visibility
的自定义控件,它包含TextBlock
和Hyperlink
。如果您向其添加TextBlock
Email
,那么您可以使用它来确定控件是否应该可见,以及DependencyProperty
及其内部{{1}的值}}
似乎应该有更好的方法来解决这个问题,但我现在无法想到任何事情。
答案 2 :(得分:-1)
我知道这不是你的问题,但为什么要使用文本块?
只需使用
<Hyperlink NavigateUri="{Binding Email}" Content="{Binding Email}"
Visibility="{Binding Email, Converter={StaticResource StringToVisibilityConverter}}" />
除非我弄错了,否则应该做你想做的事。
更新:好的,我错了,WPF Hyperlink不是Silverlight的HyperlinkButton,也没有Content属性。对我感到羞耻。