如何将 ItemsControl 与 WrapPanel 一起使用来列出以逗号分隔的项目?
我有一个 ItemsControl,它通过用逗号分隔来列出项目。代码如下:
<ItemsControl ItemsSource="{Binding MyItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text=", "
Name="commaTextBlock"/>
<TextBlock Text="{Binding}"/>
</StackPanel>
<!-- Hide the first comma -->
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding
RelativeSource={RelativeSource PreviousData}}"
Value="{x:Null}">
<Setter Property="Visibility"
TargetName="commaTextBlock"
Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
结果如下: Item1, Item2, Item3
现在,我想使用 WrapPanel 而不是 StackPanel 作为 ItemsPanelTemplate 来执行相同的操作。我测试了它,它工作正常,除了一个小细节,它执行如下操作:
Item1, Item2
, Item3
当然,这是因为逗号位于每个元素之前,而我隐藏了第一个元素。我想在每个元素后面加上逗号并隐藏最后一个,所以结果将是这样的:
Item1, Item2,
Item3
如果存在像 NextData 这样的东西,那将非常简单(所以我会绑定到这个而不是 PreviousData ),但不幸的是不存在这样的东西(或者我还没有找到)。有谁知道如何解决这个问题?
谢谢
I have an ItemsControl which lists items by separating them with a comma. The code is the following:
<ItemsControl ItemsSource="{Binding MyItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text=", "
Name="commaTextBlock"/>
<TextBlock Text="{Binding}"/>
</StackPanel>
<!-- Hide the first comma -->
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding
RelativeSource={RelativeSource PreviousData}}"
Value="{x:Null}">
<Setter Property="Visibility"
TargetName="commaTextBlock"
Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
The result is something like this: Item1, Item2, Item3
Now, I'd like to do the same using a WrapPanel instead of a StackPanel as the ItemsPanelTemplate. I tested it and it works fine, except for a small detail, it does something like this:
Item1, Item2
, Item3
Of course this is because the comma is before each element and I hide the first one. I would like to put the comma after each element and hide the last one, so the result would be this:
Item1, Item2,
Item3
It would be really simple if there existed something like NextData (so I would bind to this instead of to PreviousData), but unfortunately no such thing exists (or I haven't found one). Does anyone have an idea how to solve this problem?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我已经为类似的问题做了一个可见性转换器:
和 转换器逻辑:
I have done a visibility converter for a similar problem:
And the converter logic:
也许您可以尝试使用多重绑定和转换器。像这样:
其中
root
是 ItemsControl 的名称。并编写一个检查位置的转换器:
对我有用!希望它能帮助您解决您的问题!
编辑:
与其他答案几乎相同,这里的区别是您的模板中只需要 1 个
TextBlock
,并且转换器决定是否有逗号。但基本原理是一样的。MultiBinding
太棒了! :-)Maybe you can try to use multibinding and a converter. Something like this:
Where
root
is the name of your ItemsControl.And write a converter which checks for position:
Works for me! Hope it helps you with your problem!
EDIT:
Almost the same as the other answer, the difference here is that you only need 1
TextBlock
in your template, and the converter decides if there is a comma or not. But basically the same principle.MultiBinding
rocks! :-)