Складной «список» связанных элементов в WPF - PullRequest
0 голосов
/ 20 августа 2009

У меня есть то, что я считал простым требованием, но мне трудно понять, как это сделать.

Я привязываюсь к адресу (например, Line1, Line2, Line3, Line4)

Что я хочу сделать, это отобразить

Line1
Line2
Line3
Line4

Но если какая-либо строка пуста или равна нулю, я бы хотел "свернуть":

Line1
Line3
Line4

Я пробовал StackPanel с TextBlocks - но я не знал, как заставить TextBlocks 'исчезать', если они пусты.

<StackPanel>
    <TextBlock Text="{Binding Line1}"></TextBlock>
    <TextBlock Text="{Binding Line2}"></TextBlock>
    <TextBlock Text="{Binding Line3}"></TextBlock>
    <TextBlock Text="{Binding Line4}"></TextBlock>
</StackPanel>

Я также пробовал MultiBinding, но не могу понять, как получить новую строку в 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>

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 20 августа 2009

Это немного некрасиво, но работает. Я определил стиль с триггером, который сворачивает TextBlock, если его текст - пустая строка:

<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>
2 голосов
/ 20 августа 2009

Было бы проще объединить все эти свойства в другое свойство, доступное только для чтения:

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

Однако вы также можете связать Visibility каждого TextBlock:

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

TextVisibilityConverter вернет Visibility.Collapsed, если значение null или пусто.

...