【问题标题】:WPF - DataTemplate/Value Converter for hyperlink in TextBlockWPF - TextBlock 中超链接的 DataTemplate/Value 转换器
【发布时间】:2010-10-23 17:12:15
【问题描述】:

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

请帮我解决这个问题。

谢谢!

【问题讨论】:

  • 你确定 email 不为空吗?

标签: wpf datatemplate hyperlink ivalueconverter


【解决方案1】:

我会这样做:

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

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

【讨论】:

  • 鲍勃,感谢您的回答。这根本不是冒犯。我同意为此的转换器是一种矫枉过正。但由于我有许多其他可能为空的字符串属性,所以我可以在任何地方使用转换器。我很高兴测试您的建议,但它仍然向我显示相同的结果 - 当电子邮件为空时它不会崩溃。 :(
【解决方案2】:

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

您确定是TextBlock 的大小没有折叠吗?如果您将样式放在Hyperlink 上(甚至是其内部TextBlock),也许这仍然有效?

编辑:Hyperlink 没有 Visibility 属性,因此很遗憾,将样式移至它并无济于事。我能想到的唯一其他选择是创建一个派生自TextBlock 的自定义控件,它包含HyperlinkTextBlock。如果您向其中添加Email DependencyProperty,则可以使用它来确定控件是否应该可见,以及Hyperlink 及其内部TextBlock 的值。

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

【讨论】:

  • 安迪,谢谢。我曾想过,但是,正如您所指出的,似乎应该有一个更直接的解决方案。我创建了一个小用户控件,效果很好。
【解决方案3】:

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

简单地使用

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

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

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

【讨论】:

  • 这对我不起作用。超链接没有 Content 属性,也不能直接添加到其容器中,因为它不是 UIElement。
  • 该死,我在考虑一个 HyperlinkBut​​ton,它存在于 Silverlight 中,而不是 WPF 中。对不起,我先去睡觉了……
猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 2021-11-16
  • 2020-12-04
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多