WPF - 用于TextBlock中超链接的DataTemplate / Value Converter

时间:2009-05-04 19:10:23

标签: wpf datatemplate hyperlink ivalueconverter

我有一个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的文本或者......

请帮我解决这个问题。

谢谢!

3 个答案:

答案 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的自定义控件,它包含TextBlockHyperlink。如果您向其添加TextBlock Email,那么您可以使用它来确定控件是否应该可见,以及DependencyProperty及其内部{{1}的值}}

似乎应该有更好的方法来解决这个问题,但我现在无法想到任何事情。

答案 2 :(得分:-1)

我知道这不是你的问题,但为什么要使用文本块?

只需使用

    <Hyperlink NavigateUri="{Binding Email}" Content="{Binding Email}" 
Visibility="{Binding Email, Converter={StaticResource StringToVisibilityConverter}}" />
除非我弄错了,否则

应该做你想做的事。

更新:好的,我错了,WPF Hyperlink不是Silverlight的HyperlinkBut​​ton,也没有Content属性。对我感到羞耻。