Pergunta

Eu tenho um ListBox mostrando uma lista de nomes de pessoas, e-mails, departamentos, etc. Há um DataTemplate que tem algumas TextBlocks para mostrar cada propriedade. Um desses TextBlocks está envolvendo um Hyperlink para mostrar endereços de e-mail assim:

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

Esta multa funciona, mas se a pessoa não tem um endereço de e-mail, o TextBlock não é recolhido automaticamente. Então eu escrevi um conversor de valor e usada no estilo assim (simplificado):

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

E este é o estilo usando o ValueConverter:

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

E acrescentei o estilo chamando o conversor para o TextBlock:

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

Após essa alteração do endereço de e-mail nunca é mostrado - No conversor de valor, o texto do TextBlock é sempre vazio e ele retorna Visibility.Collapsed. É como se estivesse avaliando o texto do TextBlock antes do Hyperlink são carregados ou algo assim ...

Por favor, me ajudar a descobrir isso.

Obrigado!

Foi útil?

Solução

O conversor que você escreveu é comparando o Text do TextBlock ao vazio, não o texto do Hyperlink interior. Eu acho que você realmente quer definir o RelativeSource ao Hyperlink criança, mas eu não acho que isso é possível.

Você tem certeza de que é o tamanho do TextBlock que não se desmoronou? Se você colocar o estilo no Hyperlink vez (ou mesmo sua TextBlock interior), talvez que o trabalho seria ainda?

Edit: Hyperlink não tem uma propriedade Visibility, então mover o estilo a ele não vai ajudar, infelizmente. A única outra opção que eu posso pensar é criar um controle personalizado que deriva de TextBlock, e que contém uma Hyperlink e TextBlock. Se você adicionar um Email DependencyProperty a ele, então você pode usar isso para determinar se o controle deve ser visível ou não, e para o valor do Hyperlink e sua TextBlock interior.

Parece que deve haver uma maneira melhor de lidar com isso, mas eu não consigo pensar em nada atualmente.

Outras dicas

eu faria algo assim:

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

Eu acho que escrever um conversor de valor é um exagero (sem querer ofender).

Eu sei que isso não é exatamente a sua pergunta, mas por que você usa TextBlocks em tudo?

Simplesmente usando

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

deve fazer o que você quer que ele faça, se não me engano.

Atualização: OK, eu estou enganado, WPF Hyperlink não é HyperlinkButton do Silverlight e não tem uma propriedade de conteúdo. Shame on me.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top