使用WPF,如何根据其子TextBlock的内容折叠TextBlock?

时间:2009-04-17 08:28:58

标签: .net wpf data-binding .net-3.5

我必须显示一个很大的属性/值列表。我的问题是所有这些属性都没有值,所以我不希望在这种情况下显示这些属性。

使用某些代码更容易理解我的问题:

<StackPanel DataContext=...>
<TextBlock>Info1:<TextBlock Text={Binding Path=Info1} /></TextBlock>
<TextBlock>Info2:<TextBlock Text={Binding Path=Info2} /></TextBlock>
<TextBlock>Info3:<TextBlock Text={Binding Path=Info3} /></TextBlock>
</StackPanel>

基本上,根据子TextBlock的内容,我想折叠父TextBlock。我的想法是使用适用于所有TextBlock的样式并检查内容,如果没有,则折叠父级......遗憾的是,我无法从DataTrigger访问父级。可能你会有一个比这更整洁的解决方案:)

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您可以使用简单的转换器将外部文本块的可见性绑定到内部文本块的文本:

<TextBlock Name="outer1" 
           Visibility="{Binding ElementName=inner1, Path=Text, Converter={StaticResource MyConverter}}">
    Info1:<TextBlock Name="inner1" Text="{Binding Path=Info1}" />
</TextBlock>

或将外部文本块的可见性直接绑定到Info1:

 <TextBlock Visibility="{Binding Path=Info1, Converter={StaticResource MyConverter}}">
    Info1:<TextBlock Text="{Binding Path=Info1}" />
</TextBlock>

答案 1 :(得分:1)

如果您位于模板或样式中,则可以使用触发器设置外部文本块的可见性。

例如,如果是DataTemplate

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=Info1}" Value="">
        <Setter Property="Visibility" TargetName="pnlInfo1" Value="Hidden" />
    </DataTrigger>
    <!-- and so on ... -->
</DataTemplate.Triggers>

根据需要调整触发器。例如,您可以在null时隐藏它,或者使用转换器作为gcores建议进行更多花哨的检查。