我认为这是一个简单的要求,但我很难解决如何做到这一点。
我绑定到一个地址(例如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>
有什么想法吗?
答案 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
。