Frage

Ich habe eine ListBox eine Liste von Personen die Namen zeigen, E-Mails, Abteilungen etc. Es gibt eine Datatemplate ist, dass ein paar Textblocks hat jede Eigenschaft angezeigt werden soll. Eines dieser Textblöcke wird Umwickeln eines Hyperlink E-Mail-Adressen zu zeigen, wie so:

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

Das 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 mit dem Valueconverter:

<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, den Konverter Textblock Aufruf:

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

Nach dieser Änderung der E-Mail-Adresse niemals angezeigt wird - im Wertwandler, der Text des Textblockes ist immer leer und es gibt Visibility.Collapsed. Es ist wie es ist, den Text des Textblockes Auswertung vor der Hyperlink geladen werden oder so ...

Bitte helfen Sie mir diesen einen Reim darauf machen.

Danke!

War es hilfreich?

Lösung

Der Konverter, die Sie geschrieben wird, um die Text des TextBlock zu leeren, nicht den Text des inneren Hyperlink zu vergleichen. Ich denke, dass Sie die RelativeSource des Kind Hyperlink wirklich einstellen wollen, aber ich glaube nicht, das ist möglich.

Sind Sie sicher, dass es die Größe des ist TextBlock, die nicht zusammengebrochen ist erhalten? Wenn Sie den Stil auf dem Hyperlink statt (oder sogar sein innerer TextBlock) setzen, vielleicht wäre das noch?

Edit: Hyperlink keine Visibility Eigenschaft hat, so den Stil, um es zu bewegen wird nicht helfen, leider. Die einzige andere Möglichkeit, die ich denken kann, ist ein benutzerdefiniertes Steuerelement zu erstellen, die von TextBlock ableitet, und es enthält eine Hyperlink und TextBlock. Wenn Sie eine Email DependencyProperty, um es hinzuzufügen, dann können Sie verwenden, um zu bestimmen, ob das Steuerelement sichtbar sein soll oder nicht, und für den Wert der Hyperlink und seinen inneren TextBlock.

Es scheint, wie es sollte ein besserer Weg, dies zu umgehen, aber ich kann nichts zur Zeit nicht denken.

Andere Tipps

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 Wert Konverter zu schreiben ist viel des Guten (keine Beleidigung beabsichtigt).

Ich weiß, das ist nicht gerade Ihre Frage, aber warum verwenden Sie Textblocks überhaupt?

Sie einfach mit

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

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top