WPF集合控件實(shí)現(xiàn)分隔符(ItemsControl Separator)
在WPF的集合控件中常常需要在每一個(gè)集合項(xiàng)之間插入一個(gè)分隔符樣式,但是WPF的ItemsControl沒(méi)有相關(guān)功能的直接實(shí)現(xiàn),所以只能考慮曲線救國(guó),經(jīng)過(guò)研究,大概想到了以下兩種實(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)的頭部都可以看見(jiàn)分隔符,現(xiàn)在我們的目標(biāo)是要隱藏掉第一項(xiàng)的分隔符,這就達(dá)到了項(xiàng)與項(xiàng)之間才有分隔符的目的。
第一種實(shí)現(xiàn)方式最簡(jiǎn)單,使用集合項(xiàng)前向綁定PreviousData,這是四種綁定方式中的一種,估計(jì)也是平時(shí)用得最少的一種,不過(guò)此時(shí)就派上用場(chǎng)了,代碼如下:
<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í)就隱藏分隔符,簡(jiǎn)單的一行代碼搞定。不過(guò)這種實(shí)現(xiàn)方式有個(gè)缺點(diǎn)就是如果使用的是Insert方式向綁定的數(shù)據(jù)源的最前面添加數(shù)據(jù)則就會(huì)出現(xiàn)不止一個(gè)沒(méi)有分隔符的項(xiàng),如果是往隊(duì)尾或者隊(duì)中添加則不會(huì)出現(xiàn)這個(gè)問(wèn)題。
第二種實(shí)現(xiàn)方式是借助ItemsControl的AlternationCount和AlternationIndex屬性來(lái)為集合項(xiàng)標(biāo)記索引號(hào),再隱藏索引號(hào)為0的項(xiàng)的分隔符,代碼如下:
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è)功能,無(wú)論向隊(duì)首插入還是隊(duì)尾插入,但是AlternationCount和AlternationIndex屬性本來(lái)的含義是用來(lái)實(shí)現(xiàn)比如隔行變色等功能,此時(shí)這種功能被占用,所以如果你的集合要同時(shí)實(shí)現(xiàn)分隔符和隔行樣式的功能可能需要額外加轉(zhuǎn)換器,不過(guò)轉(zhuǎn)換器內(nèi)容也很簡(jiǎn)單,求個(gè)余數(shù)就能還原之前的功能了。
這個(gè)小功能的代碼參見(jiàn):https://github.com/fengrui358/WPFLabs/tree/master/WpfItemsControlSplitter
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Asp.NetCore3.1開(kāi)源項(xiàng)目升級(jí)為.Net6.0的方法實(shí)現(xiàn)
自從.Net6.0出來(lái)后,一直想之前開(kāi)發(fā)的項(xiàng)目升級(jí).Net6.0,本文就詳細(xì)的介紹一下如何將Asp.NetCore3.1開(kāi)源項(xiàng)目升級(jí)為.Net6.0,感興趣的小伙伴們可以參考一下2021-12-12
ASP.NET?MVC使用jQuery?ui的progressbar實(shí)現(xiàn)進(jìn)度條
這篇文章介紹了ASP.NET?MVC使用jQuery?ui的progressbar實(shí)現(xiàn)進(jìn)度條的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
.NET6創(chuàng)建Windows服務(wù)的實(shí)現(xiàn)步驟
本文主要介紹了.NET6創(chuàng)建Windows服務(wù)的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
如何利用HttpClientFactory實(shí)現(xiàn)簡(jiǎn)單的熔斷降級(jí)
這篇文章主要給大家介紹了關(guān)于如何利用HttpClientFactory實(shí)現(xiàn)簡(jiǎn)單的熔斷降級(jí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
用Html5與Asp.net MVC上傳多個(gè)文件的實(shí)現(xiàn)代碼
Html 5 的有一些File API,對(duì)Form表單增強(qiáng)的特性,讓我們輕松支持多文件上傳,看下面的Html片斷代碼2012-08-08
asp.net分頁(yè)控件AspNetPager的樣式美化
自從吳旗娃推出了AspNetPager分頁(yè)控件之后,受到了廣大程序員朋友的喜愛(ài),無(wú)數(shù)個(gè)網(wǎng)站都出現(xiàn)這個(gè)控件的身影??墒谴蟛糠志W(wǎng)站程序員的朋友都是直接套用,導(dǎo)致滿世界的分頁(yè)控件樣式都是一樣的簡(jiǎn)潔,傷不起啊2011-12-12
ASP.NET中畫(huà)圖形驗(yàn)證碼的實(shí)現(xiàn)代碼
這篇文章給大家介紹了asp.net中畫(huà)圖形驗(yàn)證碼的實(shí)現(xiàn)方法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01

