在the previous question of mine中,我询问了如何隐藏空TextBlock
,以便它不占用面板中的空间。我现在面临新的挑战。我该如何隐藏空Hyperlink
:
<TextBlock>
<Hyperlink
NavigateUri="{Binding Path=Email}"
RequestNavigate="Hyperlink_RequestNavigate">
<TextBlock Text="{Binding Path=Email}" />
</Hyperlink>
</TextBlock>
这就是上一个问题隐藏的原因:
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
在第一个TextBlock
上提供此样式将不起作用,因为未设置Text
属性。在Hyperlink
上提供样式不会隐藏父TextBlock
,如果我尝试隐藏TextBlock
内的Hyperlink
,也会发生同样的情况。
我确信我的样式需要应用于Hyperlink
,但内部触发器应该定位'Hyperlink Visibility
TextBlock`的's parent
属性。应该是什么样的风格?
答案 0 :(得分:3)
只需在顶级DataTrigger
上使用TextBlock
来检查绑定属性是否为空字符串:
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding Email}" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
修改强>
您也可以尝试绑定到子超链接的NavigationUri
属性:
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Inlines
[0].NavigateUri}" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
答案 1 :(得分:0)
solution提供的Foovanadil通过实施可见性转换器来解决类似问题,在我看来效果最好。它是最容易实现的,可以在需要时重复使用。
转换器应该像这样实现:
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
public class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
if (string.IsNullOrEmpty(value as string))
{
return Visibility.Collapsed;
}
else
{
return Visibility.Visible;
}
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
throw new NotSupportedException();
}
}
}
并像这样使用:
<Window.Resources>
<!-- Visibility converter -->
<converters:VisibilityConverter x:Key="visibleConv" />
</Window.Resources>
...
<TextBlock Visibility="{Binding Something, Converter={StaticResource visibleConv}}">
<Hyperlink NavigateUri="{Binding Something}">
<TextBlock Text="{Binding Something}" />
</Hyperlink>
</TextBlock>
所有积分均转至原始解决方案提供商:Foovanadil