zoukankan      html  css  js  c++  java
  • WPF集合控件实现分隔符(ItemsControl Separator)

    在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属性本来的含义是用来实现比如隔行变色等功能,此时这种功能被占用,所以如果你的集合要同时实现分隔符和隔行样式的功能可能需要额外加转换器,不过转换器内容也很简单,求个余数就能还原之前的功能了。

  • 相关阅读:
    “终身幼儿园”:学习是一个创造的过程
    我对ERP实质的理解(陈启申)
    Java学习记录1java并发编程之synchronized初学
    谈谈你对Spring的理解
    java中的==与equals的区别
    Windows下编译安装perl Module
    win系统用virtualBox安装Ubuntu虚拟机,如何共享数据
    Windows下emacsw3m设置代理
    自我介绍
    document 对象
  • 原文地址:https://www.cnblogs.com/sjqq/p/7891021.html
Copyright © 2011-2022 走看看