WPF集合控件實現(xiàn)分隔符(ItemsControl Separator)
在WPF的集合控件中常常需要在每一個集合項之間插入一個分隔符樣式,但是WPF的ItemsControl沒有相關(guān)功能的直接實現(xiàn),所以只能考慮曲線救國,經(jīng)過研究,大概想到了以下兩種實現(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就是分隔符,此時每一項的頭部都可以看見分隔符,現(xiàn)在我們的目標是要隱藏掉第一項的分隔符,這就達到了項與項之間才有分隔符的目的。
第一種實現(xiàn)方式最簡單,使用集合項前向綁定PreviousData,這是四種綁定方式中的一種,估計也是平時用得最少的一種,不過此時就派上用場了,代碼如下:
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}"
Value="{x:Null}">
<Setter TargetName="Bd" Property="Visibility" Value="Collapsed" />
</DataTrigger>
</DataTemplate.Triggers>
當某一項的前項為空時就隱藏分隔符,簡單的一行代碼搞定。不過這種實現(xiàn)方式有個缺點就是如果使用的是Insert方式向綁定的數(shù)據(jù)源的最前面添加數(shù)據(jù)則就會出現(xiàn)不止一個沒有分隔符的項,如果是往隊尾或者隊中添加則不會出現(xiàn)這個問題。
第二種實現(xiàn)方式是借助ItemsControl的AlternationCount和AlternationIndex屬性來為集合項標記索引號,再隱藏索引號為0的項的分隔符,代碼如下:
VerticalAlignment="Stretch" AlternationCount="{Binding Source.Count}">
首先在ItemsControl上綁定AlternationCount到數(shù)據(jù)源的Count屬性上,然后此時ItemsControl的AlternationIndex屬性就變成的該集合數(shù)據(jù)源的索引號了,在觸發(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ā)器判定當索引號為0時就隱藏Border,這種方式代碼量也不大,優(yōu)點是能絕對實現(xiàn)這個功能,無論向隊首插入還是隊尾插入,但是AlternationCount和AlternationIndex屬性本來的含義是用來實現(xiàn)比如隔行變色等功能,此時這種功能被占用,所以如果你的集合要同時實現(xiàn)分隔符和隔行樣式的功能可能需要額外加轉(zhuǎn)換器,不過轉(zhuǎn)換器內(nèi)容也很簡單,求個余數(shù)就能還原之前的功能了。
這個小功能的代碼參見:https://github.com/fengrui358/WPFLabs/tree/master/WpfItemsControlSplitter
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET實現(xiàn)Hadoop增刪改查的示例代碼
本篇文章主要介紹了ASP.NET實現(xiàn)Hadoop增刪改查的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
使用DataGrid中擴展ItemRenderer和HeaderRenderer進行操作
這兩天在用Flex DataGrid做點東西,走了不少彎路,現(xiàn)將心得分享一下。2009-02-02
Coolite優(yōu)化導(dǎo)出Excel文件實現(xiàn)代碼
Coolite 優(yōu)化 導(dǎo)出 Excel 文件??梢栽O(shè)定列寬和導(dǎo)出列選擇。2010-03-03
Asp.net core利用IIS在windows上進行托管步驟詳解
這篇文章主要給大家介紹了關(guān)于Asp.net core利用IIS在windows上進行托管步驟的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
.NET 6開發(fā)TodoList應(yīng)用實現(xiàn)結(jié)構(gòu)搭建
這篇文章主要介紹了.NET 6開發(fā)TodoList應(yīng)用實現(xiàn)結(jié)構(gòu)搭建,上一篇我們講解了實現(xiàn)系列背景 ,今天繼續(xù)來講講.NET 6開發(fā)TodoList并且實現(xiàn)結(jié)構(gòu)搭建,更多詳細內(nèi)容剛興趣得小伙伴可以來參考一下下面文章得具體內(nèi)容2021-12-12
ASP.NET郵件發(fā)送system.Net.Mail案例
這篇文章主要為大家詳細介紹了ASP.NET郵件發(fā)送system.Net.Mail案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05

