WPF中绑定元素的可折叠“列表”

时间:2009-08-20 08:36:57

标签: wpf binding newline

我认为这是一个简单的要求,但我很难解决如何做到这一点。

我绑定到一个地址(例如Line1,Line2,Line3,Line4)

我想做的是显示

Line1
Line2
Line3
Line4

但如果任何行为空或为空,我想'崩溃':

Line1
Line3
Line4

我尝试过使用TextBlocks的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 个答案:

答案 0 :(得分:4)

这有点难看,但它确实有效。我已经定义了一个带有触发器的样式,如果TextBlock的文本是一个空字符串,它会折叠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>

答案 1 :(得分:2)

最简单的方法是将所有这些属性聚合到另一个绑定到的只读属性中:

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

但是,您也可以绑定每个Visibility的{​​{1}}:

TextBlock

<TextBlock Text="{Binding Line1}" Visibility="{Binding Line1, Converter={StaticResource TextVisibilityConverter}}"/> 如果值为TextVisibilityConverter或为空,则会返回Visibility.Collapsed