WPF - DataTemplate / valor Converter for hiperlink no TextBlock
-
03-07-2019 - |
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!
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.