Pregunta

Tengo un ListBox que muestra una lista de nombres de personas, correos electrónicos, departamentos, etc. Hay una DataTemplate que tiene algunos TextBlocks para mostrar cada propiedad. Uno de estos TextBlocks está envolviendo un hipervínculo para mostrar las direcciones de correo electrónico de esta manera:

<TextBlock>
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

Esto funciona bien, pero si la persona no tiene una dirección de correo electrónico, el TextBlock no se contrae automáticamente. Así que escribí un convertidor de valores y lo utilicé en el estilo como tal (simplificado):

string s = (String) value;
if (s == ""){
   return Visibility.Collapsed;
}
return Visibility.Visible;

Y este es el estilo que usa el ValueConverter:

<Style x:Key="ResultItemTextBoxStyle">
    <Setter Property="TextBlock.Visibility" Value="{Binding Path=Text, RelativeSource={RelativeSource Self}, 
                                                    Converter={StaticResource StringToVisibilityConverter}}"/>
</Style>

Y agregué el estilo que llama al convertidor al TextBlock:

<TextBlock Style="{StaticResource ResultItemTextBoxStyle}">
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

Después de este cambio, la dirección de correo electrónico nunca se muestra: en el convertidor de valores, el texto del TextBlock siempre está vacío y devuelve Visibility.Collapsed. Es como evaluar el texto del TextBlock antes de que se cargue el hipervínculo o algo así ...

Por favor, ayúdame a resolver esto.

¡Gracias!

¿Fue útil?

Solución

El convertidor que escribió está comparando el Text del TextBlock con el vacío, no el texto del Hyperlink interno. Creo que realmente desea establecer RelativeSource en el Hyperlink secundario, pero no creo que sea posible.

¿Está seguro de que el tamaño de TextBlock no se colapsa? Si coloca el estilo en el Hipervínculo (o incluso en su TextBlock ) interno, tal vez aún funcione.

Editar: Hipervínculo no tiene una propiedad Visibility , por lo que mover el estilo no ayudará, desafortunadamente. La única otra opción que se me ocurre es crear un control personalizado que se derive de TextBlock y contenga un Hyperlink y TextBlock . Si le agrega un Email DependencyProperty , entonces puede usar eso para determinar si el control debería estar visible o no, y por el valor del Hipervínculo y su TextBlock interno.

Parece que debería haber una mejor manera de manejar esto, pero no puedo pensar en nada actualmente.

Otros consejos

Haría algo como esto:

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

Creo que escribir un convertidor de valores es una exageración (sin intención de ofensa).

Sé que esta no es exactamente tu pregunta, pero ¿por qué usas bloques de texto?

Simplemente usando

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

debería hacer lo que usted quiere que haga, a menos que esté equivocado.

actualización: OK, estoy equivocado, WPF Hyperlink no es HyperlinkButton de Silverlight y no tiene una propiedad de Contenido. Qué vergüenza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top