2009-05-04 9 views
1

J'ai un ListBox montrant une liste des noms des personnes, des emails, des départements, etc. Il y a un DataTemplate qui a quelques TextBlocks pour afficher chaque propriété. L'un de ces TextBlocks est enroulant un lien hypertexte pour afficher les adresses e-mail comme ceci:WPF - DataTemplate/Value Converter pour le lien hypertexte dans TextBlock

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

Cela fonctionne très bien, mais si la personne ne possède pas d'adresse e-mail, le TextBlock n'est pas effondré automatiquement. J'ai donc écrit un convertisseur de valeur et utilisé dans le style comme si (simplifié):

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

Et c'est le style en utilisant le 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 à la TextBlock:

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

Après ce changement, l'adresse e-mail est jamais montré - Dans le convertisseur de valeur, le texte de la TextBlock est toujours vide et il retourne Visibility.Collapsed. C'est comme si elle évaluait le texte du TextBlock avant que le lien hypertexte soit chargé ou quelque chose ...

Aidez-moi à comprendre cela.

Merci!

+0

Etes-vous sûr que le courrier électronique n'est pas nul? –

Répondre

1

Le convertisseur que vous avez écrit compare Text du TextBlock à vide, pas le texte du Hyperlink intérieur. Je pense que vous voulez vraiment mettre le RelativeSource à l'enfant Hyperlink, mais je ne pense pas que ce soit possible.

Etes-vous sûr que c'est la taille de TextBlock qui ne s'est pas effondrée? Si vous mettez le style sur le Hyperlink à la place (ou même son intérieur TextBlock), peut-être que cela fonctionnerait encore?

Editer: Hyperlink n'a pas de propriété Visibility, donc déplacer le style ne servira à rien, malheureusement. La seule autre option que je peux penser est de créer un contrôle personnalisé qui dérive de TextBlock, et il contient un Hyperlink et TextBlock. Si vous lui ajoutez un EmailDependencyProperty, vous pouvez l'utiliser pour déterminer si le contrôle doit être visible ou non, et pour la valeur Hyperlink et TextBlock.

Il semble qu'il devrait y avoir une meilleure façon de gérer cela, mais je ne peux penser à rien pour le moment.

+0

Andy, merci. J'avais pensé à cela mais, comme vous l'avez souligné, il semble qu'il devrait y avoir une solution plus directe. J'ai créé un petit contrôle utilisateur et cela a bien fonctionné. –

-1

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

simplement en utilisant

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

devrait faire ce que vous voulez faire ne, à moins que je me trompe. Mise à jour: OK, je me trompe, WPF Hyperlink n'est pas HyperlinkButton de Silverlight et n'a pas de propriété Content. Honte sur moi.

+0

Cela ne fonctionne pas pour moi. Le lien hypertexte n'a pas de propriété Content et il ne peut pas être ajouté directement à son conteneur, car il ne s'agit pas d'un UIElement. – Andy

+0

Dammit, je pensais à un HyperlinkButton, qui existe dans Silverlight, pas WPF. Désolé pour ça, je vais me coucher maintenant ... –

2

je ferais quelque chose comme ceci:

<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 écrire un convertisseur de valeur est surpuissant (aucune infraction prévu).

+0

Bob, Merci pour votre réponse. Ce n'est pas une infraction du tout. Je suis d'accord qu'un convertisseur pour cela est une overkill. Mais puisque j'ai beaucoup d'autres propriétés de chaîne qui peuvent être vides, je peux utiliser le convertisseur partout. J'étais heureux de tester vos suggestions, mais il me montre toujours le même résultat - Il ne s'effondre pas lorsque l'email est vide. :( –

Questions connexes