2009-08-20 6 views
0

J'ai ce que je pensais être une simple exigence, mais j'ai du mal à m'expliquer comment le faire.'Liste' pliante d'éléments liés dans WPF

Je suis liaison à une adresse (Ligne1, Ligne2, Line3, Line4 par exemple)

Ce que je veux faire est l'affichage

Line1 
Line2 
Line3 
Line4 

Mais si une ligne est vide ou nulle, je « d comme à « l'effondrement »:

Line1 
Line3 
Line4 

J'ai essayé un StackPanel avec TextBlocks - mais je n'ai pas travaillé sur la façon d'obtenir les TextBlocks à « disparaître » si elles sont vides. J'ai également essayé MultiBinding, mais je n'arrive pas à trouver comment obtenir un retour à la ligne dans StringFormat.

<TextBlock> 
    <TextBlock.Text> 
     <!-- Doesn't work: "System.FormatException" --> 
     <MultiBinding StringFormat="{}{1}\n{2}\n{3}\n{4}"> 
      <Binding Path="Line1"/> 
      <Binding Path="Line2"/> 
      <Binding Path="Line3"/> 
      <Binding Path="Line4"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Des idées?

Répondre

4

C'est un peu moche, mais ça marche. J'ai défini un style avec un déclencheur qui effondre un TextBlock si son texte est une chaîne vide:

<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding Text,RelativeSource={RelativeSource Self}}" 
        Value=""> 
        <Setter Property="Visibility" Value="Collapsed" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </StackPanel.Resources> 
    <TextBlock Text="{Binding Line1}" /> 
    <TextBlock Text="{Binding Line2}" /> 
    <TextBlock Text="{Binding Line3}" /> 
    <TextBlock Text="{Binding Line4}" /> 
</StackPanel> 
+0

Il est moche, mais je pense que je le préfère, parce que je ne veux pas que ma classe ait à s'inquiéter de la façon dont les données vont être affichées – Benjol

+0

Vous ne voulez pas éliminer tout style global appliqué à TextBlock, ajoutez BasedOn = "{StaticResource {x: Type TextBlock}}" à votre déclaration de style (je pense que j'ai raison) –

+0

@Benjol: si vous utilisez MVVM, cela devient beaucoup plus naturel, cela signifie que votre machine virtuelle s'inquiète de la façon dont les choses sont affichées et qu'elle aura la propriété en lecture seule pour faire l'agrégation –

2

Il serait plus simple d'agréger toutes ces propriétés dans un autre readonly qui vous lient à:

<TextBlock Text="{Binding Address}"/> 

Cependant, vous pouvez également lier la Visibility de chaque TextBlock:

<TextBlock Text="{Binding Line1}" Visibility="{Binding Line1, Converter={StaticResource TextVisibilityConverter}}"/> 

Le TextVisibilityConverter retournera Visibility.Collapsed si la valeur est null ou vide.

+1

Je suis étonné de ce que je pense vont être plus facile à WPF tourner toujours être compliqué. Malheureusement, l'inverse n'est pas toujours le cas :( – Benjol