Question

J'ai un ListBox affichant une liste de noms de personnes, de courriers électroniques, de départements, etc. Il existe un DataTemplate qui contient quelques TextBlocks pour afficher chaque propriété. Un de ces TextBlocks encapsule un lien hypertexte pour afficher les adresses électroniques de la manière suivante:

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

Cela fonctionne bien, mais si la personne n'a pas d'adresse électronique, le TextBlock n'est pas réduit automatiquement. J'ai donc écrit un convertisseur de valeur et utilisé dans le style suivant (simplifié):

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

Et voici le style utilisant ValueConverter:

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

Et j'ai ajouté le style appelant le convertisseur au TextBlock:

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

Après cette modification, l'adresse e-mail n'est jamais affichée - Dans le convertisseur de valeur, le texte du TextBlock est toujours vide et renvoie Visibility.Collapsed. C'est comme si on évaluait le texte du TextBlock avant le chargement du lien hypertexte ou quelque chose du genre ...

S'il vous plaît, aidez-moi à comprendre celui-ci.

Merci!

Était-ce utile?

La solution

Le convertisseur que vous avez écrit compare le texte du TextBlock à vide, pas le texte du lien hypertexte intérieur. Je pense que vous voulez vraiment définir RelativeSource sur l'enfant Hyperlien , mais je ne pense pas que ce soit possible.

Êtes-vous sûr que la taille de TextBlock n'est pas réduite? Si vous mettez le style sur le lien hypertexte à la place (ou même sur son TextBlock interne), peut-être que cela fonctionnerait toujours?

Edition: Le lien hypertexte ne possède pas de propriété Visibility . Par conséquent, le déplacement du style dans ce fichier ne vous aidera pas, malheureusement. La seule autre option à laquelle je puisse penser est de créer un contrôle personnalisé dérivé de TextBlock , et contenant un Hyperlien et un TextBlock . Si vous ajoutez un Email DependencyProperty , vous pouvez l'utiliser pour déterminer si le contrôle doit être visible ou non, et pour la valeur du Lien hypertexte et son TextBlock interne.

Il semble qu'il devrait y avoir un meilleur moyen de gérer cela, mais je ne peux penser à rien actuellement.

Autres conseils

Je voudrais faire quelque chose comme ça:

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

Je pense que l’écriture d’un convertisseur de valeur est excessive (sans vouloir offenser).

Je sais que ce n'est pas exactement votre question, mais pourquoi utilisez-vous du tout des blocs de texte?

En utilisant simplement

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

devrait faire ce que vous voulez, sauf si je me trompe.

mise à jour: OK, je me trompe, l'hyperlien WPF n'est pas l'hyperlienButton de Silverlight et n'a pas de propriété Content. Honte à moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top