可折叠';列表';WPF中绑定元素的定义

可折叠';列表';WPF中绑定元素的定义,wpf,binding,newline,Wpf,Binding,Newline,我有一个我认为很简单的要求,但我很难想出怎么做 我绑定到一个地址(例如第1行、第2行、第3行、第4行) 我想做的是展示 Line1 Line2 Line3 Line4 但如果任何一行为空或null,我想“折叠”: Line1 Line3 Line4 我尝试了一个带有文本块的StackPanel,但我还没有想出如何让文本块在它们为空时“消失” <StackPanel> <TextBlock Text="{Binding Line1}"></TextBloc

我有一个我认为很简单的要求,但我很难想出怎么做

我绑定到一个地址(例如第1行、第2行、第3行、第4行)

我想做的是展示

Line1
Line2
Line3
Line4
但如果任何一行为空或null,我想“折叠”:

Line1
Line3
Line4
我尝试了一个带有文本块的StackPanel,但我还没有想出如何让文本块在它们为空时“消失”

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

我也尝试过多重绑定,但我不知道如何获得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>


有什么想法吗?

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

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

TextVisibilityConverter
将返回
Visibility.Collapsed
,如果值为
null
或为空。

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

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

TextVisibilityConverter
将返回
Visibility.Collapsed
,如果值为
null
或为空。

这有点难看,但它可以工作。我已经定义了一个样式,该样式带有一个触发器,如果文本为空字符串,则会折叠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>

这有点难看,但它可以工作。我已经定义了一个样式,该样式带有一个触发器,如果文本为空字符串,则会折叠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>


让我惊讶的是,我认为在WPF中更容易的事情总是变得复杂。不幸的是,相反的情况并不总是如此:(我感到惊讶的是,我认为在WPF中更容易的事情总是变得复杂。不幸的是,相反的情况并不总是如此:(这很难看,但我想我更喜欢它,因为我不想让我的类担心它的数据将如何显示。此外,如果您不想消除应用于TextBlock的任何全局样式,请在样式声明中添加BasedOn=“{StaticResource{x:Type TextBlock}}”(我想我已经做到了)@Benjol:如果你使用MVVM,这会变得更自然。这意味着你的VM担心事物的显示方式,并且它将具有只读属性来进行聚合。好吧,我接受我喜欢的答案。比我更聪明的人可能会不同意……这很难看,但我想我更喜欢它,因为我不想要我的课程另外,如果您不想消除应用于TextBlock的任何全局样式,请在样式声明中添加BasedOn=“{StaticResource{x:Type TextBlock}}”(我想我是对的)@Benjol:如果你使用的是MVVM,这会变得更自然。这意味着你的VM担心事物的显示方式,并且它将具有只读属性来进行聚合。好吧,我接受我喜欢的答案。比我更聪明的人可能会不同意。。。