博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF集合控件实现分隔符(ItemsControl Separator)
阅读量:4597 次
发布时间:2019-06-09

本文共 2133 字,大约阅读时间需要 7 分钟。

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

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

 
<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://www.cnblogs.com/sjqq/p/7891021.html

你可能感兴趣的文章
心得五
查看>>
react antD moment
查看>>
MySql创建指定字符集的数据库
查看>>
bzoj 3172 AC自动机
查看>>
rabbitmq
查看>>
解决Latex中Itemize距离过大的问题
查看>>
1打印沙漏
查看>>
LeetCode | Rotate List
查看>>
CodeForces - 455D
查看>>
【转】Django模糊查询
查看>>
Bugtags 创业一年总结
查看>>
UML建模原理
查看>>
[BZOJ 1083] [SCOI2005] 繁忙的都市
查看>>
图解C#的值类型,引用类型,栈,堆,ref,out
查看>>
spring5.0版本-AOP-如何实现拦截器链式调用(责任链模式)
查看>>
dht11 temperature & humidity sensor v2
查看>>
selenium 启动 IE11
查看>>
习题6.6
查看>>
系统分析与设计第三次作业
查看>>
Redis——非阻塞IO和队列
查看>>