49 votos

Cómo ocultar el vacío TextBlock?

En el XAML se proporcionan a continuación, no tengo el valor para el Teléfono a veces. Cuando eso sucede, el valor es falta, pero el TextBlock sigue ocupando el espacio en el panel. Quiero ocultar vacía TextBlocks de tomar el espacio en el StackPanel.

Aquí está el código XAML:

<StackPanel>
    <TextBlock Text="{Binding Path=FirstName}" />
    <TextBlock Text="{Binding Path=LastName}" />
    <TextBlock Text="{Binding Path=Phone}" />
    <TextBlock Text="{Binding Path=Email}" />
</StackPanel>

He leído este artículo, pero la aceptó respuesta no me funciona:

<StackPanel>
    <TextBlock Text="{Binding Path=FirstName}" />
    <TextBlock Text="{Binding Path=LastName}" />
    <TextBlock Text="{Binding Path=Phone}">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <Trigger Property="Text" Value="{x:Null}">
                        <Setter Property="Visibility" Value="Collapsed" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    <TextBlock Text="{Binding Path=Email}" />
</StackPanel>

Estoy haciendo un error en alguna parte, o es el aceptado la respuesta mal? ¿Qué debo hacer para lograr mi objetivo?

79voto

CodeNaked Puntos 23538

Usted probablemente necesitará utilizar:

<Style TargetType="TextBlock">
        <Style.Triggers>
            <Trigger Property="Text" Value="">
                <Setter Property="Visibility" Value="Collapsed" />
            </Trigger>
        </Style.Triggers>
</Style>

o tal vez ambas cosas:

<Style TargetType="TextBlock">
        <Style.Triggers>
            <Trigger Property="Text" Value="">
                <Setter Property="Visibility" Value="Collapsed" />
            </Trigger>
            <Trigger Property="Text" Value="{x:Null}">
                <Setter Property="Visibility" Value="Collapsed" />
            </Trigger>
        </Style.Triggers>
</Style>

40voto

Brad Cunningham Puntos 3835

En lugar de introducir un estilo sólo para este tiendo a preferir el uso de un convertidor para este tipo de cosas que va a controlar una cadena null o una cadena Vacía

<TextBlock Text="{Binding Foo}"
           Visibility="{Binding Foo, 
                        Converter={StaticResource StringToVisibiltyConverter}}" />

Donde StringToVisibiltyConverter es como este:

public class StringToVisibiltyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (String.IsNullOrEmpty((string)value))
        {
            return Visibility.Collapsed;
        }
        else
        {
            return Visibility.Visible;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

13voto

devdigital Puntos 22495

Usted puede utilizar un DataTrigger:

<TextBlock Text="{Binding Path=Title}">
    <TextBlock.Style>
       <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Title}" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
            </Style.Triggers>
       </Style>
    </TextBlock.Style>
</TextBlock>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: