我有一个列表框,显示人员姓名、电子邮件、部门等的列表。有一个 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 的 HyperlinkBut​​ton,并且没有 Content 属性。我真丢脸。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top