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!

È stato utile?

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 .

interno

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top