CollectionViewならVisual State Managerで選択時の背景色を変えられる
CollectionViewであればDataTemplate直下のコンテナ要素の背景色をVisual State Managerで切り替えることで,アイテム選択時の背景色を変更できる.
これは素晴らしい!プラットフォームごとに実装する必要がない.とても簡単.
StyleのターゲットはあくまでもGridやStackLayoutといったDataTemplate直下のコントロールである必要がある.
以下の例はGrid
に対してVisual State Managerを使って選択時と非選択時のStyleを定義したときの,ListViewとCollectionViewでの挙動の比較です.
<?xml version="1.0" encoding="utf-8" ?> <ContentPage x:Class="XFListViewBGColor.MainPage" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <ContentPage.Resources> <ResourceDictionary> <Style TargetType="Grid"> <Setter Property="VisualStateManager.VisualStateGroups"> <VisualStateGroupList> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal" /> <VisualState x:Name="Selected"> <VisualState.Setters> <Setter Property="BackgroundColor" Value="LightSkyBlue" /> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateGroupList> </Setter> </Style> </ResourceDictionary> </ContentPage.Resources> <StackLayout> <Label Text="Hello" /> <ListView ItemsSource="{Binding Items}"> <d:ListView.ItemsSource> <x:Array Type="{x:Type x:String}"> <x:String>Item 1</x:String> <x:String>Item 2</x:String> <x:String>Item 3</x:String> <x:String>Item 4</x:String> <x:String>Item 5</x:String> <x:String>Item 6</x:String> <x:String>Item 7</x:String> </x:Array> </d:ListView.ItemsSource> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid> <Label Text="{Binding .}" /> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> <CollectionView ItemsSource="{Binding Items}" SelectionMode="Single"> <d:CollectionView.ItemsSource> <x:Array Type="{x:Type x:String}"> <x:String>Item 1</x:String> <x:String>Item 2</x:String> <x:String>Item 3</x:String> <x:String>Item 4</x:String> <x:String>Item 5</x:String> <x:String>Item 6</x:String> <x:String>Item 7</x:String> </x:Array> </d:CollectionView.ItemsSource> <CollectionView.ItemsLayout> <LinearItemsLayout Orientation="Vertical" /> </CollectionView.ItemsLayout> <CollectionView.ItemTemplate> <DataTemplate> <Grid HeightRequest="75"> <Label Text="{Binding .}" /> </Grid> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> </StackLayout> </ContentPage>
ListViewではアイテム選択時の背景色はオレンジのままだが,CollectionViewの方は指定した色になっていることがわかる.