WPF集合控件实现分隔符(ItemsControl Separator)

2025-05-29 0 87

WPF集合控件中常常需要在每一个集合项之间插入一个分隔符样式,但是WPF的ItemsControl没有相关功能的直接实现,所以只能考虑曲线救国,经过研究,大概想到了以下两种实现方式。

先写出ItemsControl的数据模板,如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
<ItemsControl ItemsSource="{Binding Source}" BorderThickness="1" BorderBrush="Blue" VerticalAlignment="Stretch">

<ItemsControl.ItemTemplate>

<DataTemplate>

<Grid>

<Grid.RowDefinitions>

<RowDefinition Height="Auto" />

<RowDefinition Height="*" />

</Grid.RowDefinitions>

<Border Name="Bd" Grid.Row="0" Height="1" Background="Red" />

<TextBlock Grid.Row="1" Text="{Binding}" />

</Grid>

</DataTemplate>

</ItemsControl.ItemTemplate>

</ItemsControl>

其中名为Bd的Border就是分隔符,此时每一项的头部都可以看见分隔符,现在我们的目标是要隐藏掉第一项的分隔符,这就达到了项与项之间才有分隔符的目的。

第一种实现方式最简单,使用集合项前向绑定PreviousData,这是四种绑定方式中的一种,估计也是平时用得最少的一种,不过此时就派上用场了,代码如下:

?

1

2

3

4

5

6
<DataTemplate.Triggers>

<DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}"

Value="{x:Null}">

<Setter TargetName="Bd" Property="Visibility" Value="Collapsed" />

</DataTrigger>

</DataTemplate.Triggers>

当某一项的前项为空时就隐藏分隔符,简单的一行代码搞定。不过这种实现方式有个缺点就是如果使用的是Insert方式向绑定的数据源的最前面添加数据则就会出现不止一个没有分隔符的项,如果是往队尾或者队中添加则不会出现这个问题。

第二种实现方式是借助ItemsControlAlternationCountAlternationIndex属性来为集合项标记索引号,再隐藏索引号为0的项的分隔符,代码如下:

复制代码 代码如下:

<ItemsControl ItemsSource="{Binding Source}" BorderThickness="1" BorderBrush="Blue"
VerticalAlignment="Stretch" AlternationCount="{Binding Source.Count}">

首先在ItemsControl上绑定AlternationCount到数据源的Count属性上,然后此时ItemsControl的AlternationIndex属性就变成的该集合数据源的索引号了,在触发器中写上逻辑即可:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
<Border Name="Bd" Grid.Row="0" Height="1" Background="Red">

<Border.Style>

<Style TargetType="{x:Type Border}">

<Style.Triggers>

<DataTrigger

Binding="{Binding Path=(ItemsControl.AlternationIndex),

RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}"

Value="0">

<Setter Property="Visibility" Value="Collapsed" />

</DataTrigger>

</Style.Triggers>

</Style>

</Border.Style>

</Border>

触发器判定当索引号为0时就隐藏Border,这种方式代码量也不大,优点是能绝对实现这个功能,无论向队首插入还是队尾插入,但是AlternationCountAlternationIndex属性本来的含义是用来实现比如隔行变色等功能,此时这种功能被占用,所以如果你的集合要同时实现分隔符和隔行样式的功能可能需要额外加转换器,不过转换器内容也很简单,求个余数就能还原之前的功能了。

这个小功能的代码参见:https://github.com/fengrui358/WPFLabs/tree/master/WpfItemsControlSplitter

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://www.cnblogs.com/qinjin/p/WPF-ItemsControl-Splitter.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 WPF集合控件实现分隔符(ItemsControl Separator) https://www.kuaiidc.com/99249.html

相关文章

发表评论
暂无评论