這篇文章主要為大家詳細介紹了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,這是四種綁定方式中的一種,估計也是平時用得最少的一種,不過此時就派上用場了,程式碼如下:
<DataTemplate.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}"> <Setter TargetName="Bd" Property="Visibility" Value="Collapsed" /> </DataTrigger> </DataTemplate.Triggers>
當某一項的前項為空時就隱藏分隔符,簡單的一行程式碼搞定。不過這種實作方式有個缺點就是如果使用的是Insert方式向綁定的資料來源的最前面新增資料則就會出現不只一個沒有分隔符號的項,如果是往隊尾或是隊中新增則不會出現這個問題。
第二種實作方式是藉助ItemsControl#的AlternationCount#和 AlternationIndex屬性來為集合項目標記索引號,再隱藏索引號為0的項目的分隔符,代碼如下:
##複製代碼 代碼如下:
ItemsControl上綁定AlternationCount到資料來源的Count屬性上,然後此時ItemsControl的AlternationIndex屬性就變成的該集合資料來源的索引號碼了,在觸發器中寫上邏輯即可:
<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>
Border,這種方式代碼量也不大,優點是能絕對實現這個功能,無論向隊首插入還是隊尾插入,但是AlternationCount和# AlternationIndex屬性原本的意思是用來實現像是隔行變色等功能,此時這種功能被佔用,所以如果你的集合要同時實作分隔符號和隔行樣式的功能可能需要額外加轉換器,不過轉換器內容也很簡單,求個餘數就能還原之前的功能了。
以上是WPF集合控制項實作分隔符號(ItemsControl Separator)的詳細內容。更多資訊請關注PHP中文網其他相關文章!