2009-05-04 2 views
1

Ich habe eine ListBox mit einer Liste von Personen Namen, E-Mails, Abteilungen usw. Es gibt eine DataTemplate, die ein paar TextBlocks hat, um jede Eigenschaft anzuzeigen. Eines dieser Textblocks wird Umwickeln eines Hyperlink E-Mail-Adressen zu zeigen, wie so:WPF - DataTemplate/Wert Konverter für Hyperlink in TextBlock

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

Dies funktioniert gut, aber wenn die Person nicht eine E-Mail-Adresse hat, wird der Textblock nicht automatisch zusammenbrach. Also schrieb ich einen Wertkonverter und im Stil verwendet, wie so (vereinfacht):

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

Und das ist die Art des Valueconverter mit:

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

Und ich hinzugefügt, um den Stil ruft den Konverter an den TextBlock-:

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

Nach dieser Änderung wird die E-Mail-Adresse niemals angezeigt - im Wertwandler, der Text des Textblockes ist immer leer und es gibt Visibility.Collapsed. Es ist, als ob es den Text des TextBlocks auswertet, bevor der Hyperlink geladen wird oder etwas ...

Bitte helfen Sie mir, dieses herauszufinden.

Danke!

+0

Sind Sie sicher, dass die E-Mail-Adresse nicht null ist? –

Antwort

1

Der von Ihnen geschriebene Konverter vergleicht die der TextBlock mit leer, nicht den Text der inneren Hyperlink. Ich denke du willst die RelativeSource wirklich auf das Kind setzen Hyperlink, aber ich glaube nicht, dass das möglich ist.

Sind Sie sicher, dass es die TextBlock Größe ist, die nicht zusammengebrochen wird? Wenn Sie stattdessen den Stil auf die Hyperlink setzen (oder sogar seine innere TextBlock), würde das vielleicht noch funktionieren?

Edit: Hyperlink hat keine Visibility Eigenschaft, so bewegt den Stil, es wird leider nicht helfen. Die einzige andere Option, die ich mir vorstellen kann, besteht darin, ein benutzerdefiniertes Steuerelement zu erstellen, das sich von TextBlock ableitet, und es enthält Hyperlink und TextBlock. Wenn Sie dazu einen EmailDependencyProperty hinzufügen, können Sie damit bestimmen, ob das Steuerelement sichtbar sein soll oder nicht, und für den Wert Hyperlink und seinen inneren Wert TextBlock.

Es scheint, als sollte es einen besseren Weg geben, damit umzugehen, aber ich kann mir momentan nichts einfallen lassen.

+0

Andy, danke. Ich hatte darüber nachgedacht, aber es scheint, als ob es eine einfachere Lösung geben sollte. Ich habe ein kleines Benutzersteuerelement erstellt und es hat gut funktioniert. –

-1

Ich weiß, dass das nicht genau deine Frage ist, aber warum benutzt du überhaupt Textblöcke?

einfach

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

verwenden, sollten das tun, was Sie es tun wollen, wenn ich nicht irre.

Update: OK, ich irre mich, WPF Hyperlink ist nicht Silverlight HyperlinkButton und hat keine Content-Eigenschaft. Schande über mich.

+0

Das funktioniert nicht für mich. Hyperlink hat keine Content-Eigenschaft und kann nicht direkt zu seinem Container hinzugefügt werden, da es kein UIElement ist. – Andy

+0

Verdammt, ich dachte an einen HyperlinkButton, der in Silverlight existiert, nicht in WPF. Entschuldigung, ich gehe jetzt ins Bett ... –

2

Ich würde so etwas tun:

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

Ich denke, ein Werteumwandler schreiben Overkill (keine Straftat bestimmt).

+0

Bob, Danke für Ihre Antwort. Es ist überhaupt keine Beleidigung. Ich stimme zu, dass ein Konverter dafür ein Overkill ist. Aber da ich viele andere String-Eigenschaften habe, die leer sein können, kann ich den Konverter überall verwenden. Ich war aufgeregt, Ihre Vorschläge zu testen, aber es zeigt immer noch das gleiche Ergebnis - Es bricht nicht zusammen, wenn die E-Mail leer ist. :( –