2011-04-06 12 views
42

En el XAML proporcionado a continuación, a veces no tengo el valor para el teléfono. Cuando eso sucede, falta el valor, pero el TextBlock sigue ocupando el espacio en el panel. Quiero ocultar TextBlock s vacíos de tomar espacio en el StackPanel.¿Cómo ocultar el TextBlock vacío?

Aquí está el 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 this article, pero la respuesta aceptada no funciona para mí:

<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 cometiendo un error en alguna parte, o se la aceptaron responder mal? ¿Qué debo hacer para lograr mi objetivo?

+0

se elimina una propiedad String.Empty teléfono o nula cuando se crea o? –

+0

Es nulo. El problema está resuelto :) – Boris

Respuesta

62

es probable que necesite usar:

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

Esto tiene el curioso efecto de ocultar cada una de mis etiquetas, incluido el texto a la derecha de las casillas de verificación. No es bueno :) –

10

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

En lugar de introducir un estilo sólo para esto, para este tipo de cosas, prefiero usar un convertidor que maneje una cadena vacía o nula.

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

Dónde StringToVisibilityConverter se define así:

[ValueConversion(typeof(string), typeof(Visibility))] 
public class StringToVisibilityConverter : 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(); 
    } 
} 
+0

Normalmente uso 'Converter's para convertir los datos para que el usuario final sea más fácil de usar, pero tu código funciona bien. Aún así, prefiero los estilos para mi escenario. ¡Gracias por una respuesta de cualquier manera! – Boris

+0

Generalmente estoy de acuerdo con eso, pero mire el convertidor ONE incorporado que WPF envía: BooleanToVisibilityConverter. Hace exactamente lo que está haciendo pero con valores booleanos –

+0

+1 Siempre es bueno condensar dos disparadores que realizan la misma función en uno. – CodeNaked