1

我有一个 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 的文本或其他东西......

请帮我解决这个问题。

谢谢!

4

3 回答 3

3

我会做这样的事情:

<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>

我认为编写一个价值转换器是矫枉过正的(无意冒犯)。

于 2009-05-04T19:38:50.813 回答
1

您编写的转换器是将 的TextTextBlock空的,而不是内部的文本进行比较Hyperlink。我认为您确实想将其设置RelativeSource为 child Hyperlink,但我认为这是不可能的。

你确定是TextBlock's 的大小不会被折叠吗?如果您将样式放在Hyperlink相反(甚至它的内部TextBlock)上,也许这仍然有效?

编辑:Hyperlink没有Visibility属性,所以不幸的是,将样式移到它不会有帮助。我能想到的唯一其他选择是创建一个从 派生的自定义控件TextBlock,它包含一个HyperlinkTextBlock。如果您向其中添加一个Email DependencyProperty,那么您可以使用它来确定控件是否应该可见,以及该控件的值Hyperlink及其内部TextBlock

似乎应该有更好的方法来处理这个问题,但我目前想不出任何东西。

于 2009-05-04T19:22:29.590 回答
-1

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

只需使用

    <Hyperlink NavigateUri="{Binding Email}" Content="{Binding Email}" 
Visibility="{Binding Email, Converter={StaticResource StringToVisibilityConverter}}" />

应该做你想做的事,除非我弄错了。

更新:好的,我弄错了,WPF Hyperlink 不是 Silverlight 的 HyperlinkBut​​ton,也没有 Content 属性。真丢人。

于 2009-05-04T19:22:09.920 回答