国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

WPF集合控件實(shí)現(xiàn)分隔符(ItemsControl Separator)

2024-07-10 13:32:15
字體:
供稿:網(wǎng)友

在WPF的集合控件中常常需要在每一個(gè)集合項(xiàng)之間插入一個(gè)分隔符樣式,但是WPF的ItemsControl沒有相關(guān)功能的直接實(shí)現(xiàn),所以只能考慮曲線救國,經(jīng)過研究,大概想到了以下兩種實(shí)現(xiàn)方式。

先寫出ItemsControl的數(shù)據(jù)模板,如下:

<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就是分隔符,此時(shí)每一項(xiàng)的頭部都可以看見分隔符,現(xiàn)在我們的目標(biāo)是要隱藏掉第一項(xiàng)的分隔符,這就達(dá)到了項(xiàng)與項(xiàng)之間才有分隔符的目的。

第一種實(shí)現(xiàn)方式最簡單,使用集合項(xiàng)前向綁定PreviousData,這是四種綁定方式中的一種,估計(jì)也是平時(shí)用得最少的一種,不過此時(shí)就派上用場了,代碼如下:

<DataTemplate.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}"     Value="{x:Null}">  <Setter TargetName="Bd" Property="Visibility" Value="Collapsed" /> </DataTrigger></DataTemplate.Triggers>

當(dāng)某一項(xiàng)的前項(xiàng)為空時(shí)就隱藏分隔符,簡單的一行代碼搞定。不過這種實(shí)現(xiàn)方式有個(gè)缺點(diǎn)就是如果使用的是Insert方式向綁定的數(shù)據(jù)源的最前面添加數(shù)據(jù)則就會(huì)出現(xiàn)不止一個(gè)沒有分隔符的項(xiàng),如果是往隊(duì)尾或者隊(duì)中添加則不會(huì)出現(xiàn)這個(gè)問題。

第二種實(shí)現(xiàn)方式是借助ItemsControlAlternationCountAlternationIndex屬性來為集合項(xiàng)標(biāo)記索引號(hào),再隱藏索引號(hào)為0的項(xiàng)的分隔符,代碼如下:

 

復(fù)制代碼 代碼如下:
<ItemsControl ItemsSource="{Binding Source}" BorderThickness="1" BorderBrush="Blue"
              VerticalAlignment="Stretch" AlternationCount="{Binding Source.Count}">

 

首先在ItemsControl上綁定AlternationCount到數(shù)據(jù)源的Count屬性上,然后此時(shí)ItemsControl的AlternationIndex屬性就變成的該集合數(shù)據(jù)源的索引號(hào)了,在觸發(fā)器中寫上邏輯即可:

<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>

觸發(fā)器判定當(dāng)索引號(hào)為0時(shí)就隱藏Border,這種方式代碼量也不大,優(yōu)點(diǎn)是能絕對(duì)實(shí)現(xiàn)這個(gè)功能,無論向隊(duì)首插入還是隊(duì)尾插入,但是AlternationCountAlternationIndex屬性本來的含義是用來實(shí)現(xiàn)比如隔行變色等功能,此時(shí)這種功能被占用,所以如果你的集合要同時(shí)實(shí)現(xiàn)分隔符和隔行樣式的功能可能需要額外加轉(zhuǎn)換器,不過轉(zhuǎn)換器內(nèi)容也很簡單,求個(gè)余數(shù)就能還原之前的功能了。

這個(gè)小功能的代碼參見:https://github.com/fengrui358/WPFLabs/tree/master/WpfItemsControlSplitter

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到ASP.NET教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平湖市| 竹溪县| 沭阳县| 紫阳县| 英吉沙县| 绥德县| 嘉定区| 建瓯市| 铜梁县| 大余县| 山西省| 西和县| 太和县| 娱乐| 陆良县| 区。| 云和县| 威远县| 尚义县| 固安县| 自贡市| 图木舒克市| 夏河县| 罗城| 榕江县| 东方市| 明光市| 阿瓦提县| 两当县| 满城县| 海丰县| 成安县| 科尔| 明星| 阳泉市| 玛多县| 扎赉特旗| 临夏县| 大洼县| 汉中市| 定南县|