可折叠';列表';WPF中绑定元素的定义
我有一个我认为很简单的要求,但我很难想出怎么做 我绑定到一个地址(例如第1行、第2行、第3行、第4行) 我想做的是展示可折叠';列表';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
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担心事物的显示方式,并且它将具有只读属性来进行聚合。好吧,我接受我喜欢的答案。比我更聪明的人可能会不同意。。。