WPF - DataTemplate / Value Converter per collegamento ipertestuale in TextBlock
-
03-07-2019 - |
Domanda
Ho un ListBox che mostra un elenco di nomi di persone, e-mail, dipartimenti, ecc. C'è un DataTemplate che ha alcuni TextBlock per visualizzare ogni proprietà. Uno di questi TextBlock sta racchiudendo un collegamento ipertestuale per mostrare gli indirizzi e-mail in questo modo:
<TextBlock>
<Hyperlink NavigateUri="{Binding Email}">
<TextBlock Text="{Binding Email}" />
</Hyperlink>
</TextBlock>
Funziona bene, ma se la persona non ha un indirizzo e-mail, TextBlock non viene compresso automaticamente. Quindi ho scritto un convertitore di valori e usato nello stile in questo modo (semplificato):
string s = (String) value;
if (s == ""){
return Visibility.Collapsed;
}
return Visibility.Visible;
E questo è lo stile che utilizza ValueConverter:
<Style x:Key="ResultItemTextBoxStyle">
<Setter Property="TextBlock.Visibility" Value="{Binding Path=Text, RelativeSource={RelativeSource Self},
Converter={StaticResource StringToVisibilityConverter}}"/>
</Style>
E ho aggiunto lo stile che chiama il convertitore a TextBlock:
<TextBlock Style="{StaticResource ResultItemTextBoxStyle}">
<Hyperlink NavigateUri="{Binding Email}">
<TextBlock Text="{Binding Email}" />
</Hyperlink>
</TextBlock>
Dopo questa modifica, l'indirizzo e-mail non viene mai mostrato: nel convertitore di valori, il testo di TextBlock è sempre vuoto e restituisce Visibilità. È come se stesse valutando il testo di TextBlock prima che il collegamento ipertestuale venisse caricato o qualcosa del genere ...
Per favore, aiutami a capire questo.
Grazie!
Soluzione
Il convertitore che hai scritto sta confrontando il Text
del TextBlock
con vuoto, non il testo del hyperlink
interno. Penso che tu voglia davvero impostare il RelativeSource
sul collegamento ipertestuale
figlio, ma non credo che sia possibile.
Sei sicuro che sia la dimensione del TextBlock
che non viene compresso? Se invece metti lo stile sul collegamento ipertestuale
(o anche sul suo TextBlock
) interno, forse funzionerebbe ancora?
Modifica: collegamento ipertestuale
non ha una proprietà Visibilità
, quindi sfortunatamente spostare lo stile su di essa non aiuta. L'unica altra opzione che mi viene in mente è quella di creare un controllo personalizzato che deriva da TextBlock
e contiene un collegamento ipertestuale
e TextBlock
. Se aggiungi un Email
DependencyProperty
, puoi usarlo per determinare se il controllo deve essere visibile o meno e per il valore di Hyperlink
e il suo TextBlock
.
Sembra che ci dovrebbe essere un modo migliore per gestirlo, ma al momento non riesco a pensare a nulla.
Altri suggerimenti
Vorrei fare qualcosa del genere:
<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>
Penso che scrivere un convertitore di valore sia eccessivo (nessuna offesa).
So che questa non è esattamente la tua domanda, ma perché usi i blocchi di testo?
Semplicemente usando
<Hyperlink NavigateUri="{Binding Email}" Content="{Binding Email}"
Visibility="{Binding Email, Converter={StaticResource StringToVisibilityConverter}}" />
dovrebbe fare quello che vuoi che faccia, a meno che non mi sbagli.
aggiornamento: OK, sbaglio, il collegamento ipertestuale WPF non è il collegamento ipertestuale Silverlight e non ha una proprietà Content. Vergognati.