Xamarin.Forms CollectionView Selection
CollectionView
définit les propriétés suivantes qui contrôlent la sélection d’élément :
SelectionMode
, de typeSelectionMode
, mode de sélection.SelectedItem
, de typeobject
, élément sélectionné dans la liste. Cette propriété a un mode de liaison par défaut deTwoWay
, et a unenull
valeur quand aucun élément n’est sélectionné.SelectedItems
, de typeIList<object>
, éléments sélectionnés dans la liste. Cette propriété a un mode de liaison par défaut deOneWay
, et a unenull
valeur quand aucun élément n’est sélectionné.SelectionChangedCommand
, de typeICommand
, qui est exécuté lorsque l’élément sélectionné change.SelectionChangedCommandParameter
, de typeobject
: paramètre passé à la commandeSelectionChangedCommand
.
Toutes ces propriétés s’appuient sur des objets BindableProperty
, ce qui signifie qu’elles peuvent être des cibles de liaisons de données.
Par défaut, la CollectionView
sélection est désactivée. Toutefois, ce comportement peut être modifié en définissant la valeur de la SelectionMode
propriété sur l’un des membres de l’énumération SelectionMode
:
None
: indique que les éléments ne peuvent pas être sélectionnés. Il s'agit de la valeur par défaut.Single
: indique qu’un seul élément peut être sélectionné, l’élément sélectionné étant mis en surbrillance.Multiple
: indique que plusieurs éléments peuvent être sélectionnés, les éléments sélectionnés étant mis en surbrillance.
CollectionView
définit un SelectionChanged
événement qui est déclenché lorsque la SelectedItem
propriété change, soit en raison de la sélection d’un élément dans la liste par l’utilisateur, soit lorsqu’une application définit la propriété . En outre, cet événement est également déclenché lorsque la SelectedItems
propriété change. L’objet SelectionChangedEventArgs
qui accompagne l’événement SelectionChanged
a deux propriétés, toutes deux de type IReadOnlyList<object>
:
PreviousSelection
: liste des éléments sélectionnés, avant la modification de la sélection.CurrentSelection
: liste des éléments sélectionnés après la modification de la sélection.
En outre, CollectionView
a une UpdateSelectedItems
méthode qui met à jour la SelectedItems
propriété avec une liste d’éléments sélectionnés, tout en ne laissant qu’une seule notification de modification.
Sélection unique
Lorsque la SelectionMode
propriété est définie sur Single
, un seul élément dans peut CollectionView
être sélectionné. Lorsqu’un élément est sélectionné, la SelectedItem
propriété est définie sur la valeur de l’élément sélectionné. Lorsque cette propriété change, le SelectionChangedCommand
est exécuté (la valeur de étant SelectionChangedCommandParameter
passée à ), ICommand
et l’événement SelectionChanged
se déclenche.
L’exemple XAML suivant montre un qui peut répondre à une CollectionView
sélection d’élément unique :
<CollectionView ItemsSource="{Binding Monkeys}"
SelectionMode="Single"
SelectionChanged="OnCollectionViewSelectionChanged">
...
</CollectionView>
Le code C# équivalent est :
CollectionView collectionView = new CollectionView
{
SelectionMode = SelectionMode.Single
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
collectionView.SelectionChanged += OnCollectionViewSelectionChanged;
Dans cet exemple de code, le OnCollectionViewSelectionChanged
gestionnaire d’événements est exécuté lorsque l’événement SelectionChanged
se déclenche, le gestionnaire d’événements récupérant l’élément précédemment sélectionné et l’élément sélectionné actuel :
void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
string previous = (e.PreviousSelection.FirstOrDefault() as Monkey)?.Name;
string current = (e.CurrentSelection.FirstOrDefault() as Monkey)?.Name;
...
}
Important
L’événement SelectionChanged
peut être déclenché par des modifications qui se produisent à la suite de la modification de la SelectionMode
propriété .
Les captures d’écran suivantes montrent la sélection d’un élément unique dans un CollectionView
:
Sélection multiple
Lorsque la SelectionMode
propriété est définie sur Multiple
, plusieurs éléments dans peuvent CollectionView
être sélectionnés. Lorsque des éléments sont sélectionnés, la SelectedItems
propriété est définie sur les éléments sélectionnés. Lorsque cette propriété change, le SelectionChangedCommand
est exécuté (la valeur de étant SelectionChangedCommandParameter
passée à ), ICommand
et l’événement SelectionChanged
se déclenche.
L’exemple XAML suivant montre un CollectionView
qui peut répondre à la sélection de plusieurs éléments :
<CollectionView ItemsSource="{Binding Monkeys}"
SelectionMode="Multiple"
SelectionChanged="OnCollectionViewSelectionChanged">
...
</CollectionView>
Le code C# équivalent est :
CollectionView collectionView = new CollectionView
{
SelectionMode = SelectionMode.Multiple
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
collectionView.SelectionChanged += OnCollectionViewSelectionChanged;
Dans cet exemple de code, le OnCollectionViewSelectionChanged
gestionnaire d’événements est exécuté lorsque l’événement SelectionChanged
se déclenche, le gestionnaire d’événements récupérant les éléments précédemment sélectionnés et les éléments sélectionnés actuels :
void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var previous = e.PreviousSelection;
var current = e.CurrentSelection;
...
}
Important
L’événement SelectionChanged
peut être déclenché par des modifications qui se produisent à la suite de la modification de la SelectionMode
propriété .
Les captures d’écran suivantes montrent la sélection de plusieurs éléments dans un CollectionView
:
Pré-sélection unique
Lorsque la SelectionMode
propriété est définie sur Single
, un seul élément du peut être présélectionné en CollectionView
affectant à la SelectedItem
propriété la valeur de l’élément . L’exemple XAML suivant montre un CollectionView
qui pré-sélectionne un élément unique :
<CollectionView ItemsSource="{Binding Monkeys}"
SelectionMode="Single"
SelectedItem="{Binding SelectedMonkey}">
...
</CollectionView>
Le code C# équivalent est :
CollectionView collectionView = new CollectionView
{
SelectionMode = SelectionMode.Single
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
collectionView.SetBinding(SelectableItemsView.SelectedItemProperty, "SelectedMonkey");
Notes
La SelectedItem
propriété a un mode de liaison par défaut de TwoWay
.
Les SelectedItem
données de propriété sont liées à la SelectedMonkey
propriété du modèle d’affichage connecté, qui est de type Monkey
. Par défaut, une TwoWay
liaison est utilisée de sorte que si l’utilisateur modifie l’élément sélectionné, la valeur de la SelectedMonkey
propriété est définie sur l’objet sélectionné Monkey
. La SelectedMonkey
propriété est définie dans la MonkeysViewModel
classe et est définie sur le quatrième élément de la Monkeys
collection :
public class MonkeysViewModel : INotifyPropertyChanged
{
...
public ObservableCollection<Monkey> Monkeys { get; private set; }
Monkey selectedMonkey;
public Monkey SelectedMonkey
{
get
{
return selectedMonkey;
}
set
{
if (selectedMonkey != value)
{
selectedMonkey = value;
}
}
}
public MonkeysViewModel()
{
...
selectedMonkey = Monkeys.Skip(3).FirstOrDefault();
}
...
}
Par conséquent, lorsque le CollectionView
apparaît, le quatrième élément de la liste est pré-sélectionné :
Pré-sélection multiple
Lorsque la SelectionMode
propriété est définie sur Multiple
, plusieurs éléments de peuvent CollectionView
être présélectionnés. L’exemple XAML suivant montre un CollectionView
qui active la pré-sélection de plusieurs éléments :
<CollectionView x:Name="collectionView"
ItemsSource="{Binding Monkeys}"
SelectionMode="Multiple"
SelectedItems="{Binding SelectedMonkeys}">
...
</CollectionView>
Le code C# équivalent est :
CollectionView collectionView = new CollectionView
{
SelectionMode = SelectionMode.Multiple
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
collectionView.SetBinding(SelectableItemsView.SelectedItemsProperty, "SelectedMonkeys");
Notes
La SelectedItems
propriété a un mode de liaison par défaut de OneWay
.
Les SelectedItems
données de propriété sont liées à la SelectedMonkeys
propriété du modèle d’affichage connecté, qui est de type ObservableCollection<object>
. La SelectedMonkeys
propriété est définie dans la MonkeysViewModel
classe et est définie sur les deuxième, quatrième et cinquième éléments de la Monkeys
collection :
namespace CollectionViewDemos.ViewModels
{
public class MonkeysViewModel : INotifyPropertyChanged
{
...
ObservableCollection<object> selectedMonkeys;
public ObservableCollection<object> SelectedMonkeys
{
get
{
return selectedMonkeys;
}
set
{
if (selectedMonkeys != value)
{
selectedMonkeys = value;
}
}
}
public MonkeysViewModel()
{
...
SelectedMonkeys = new ObservableCollection<object>()
{
Monkeys[1], Monkeys[3], Monkeys[4]
};
}
...
}
}
Par conséquent, lorsque le CollectionView
apparaît, les deuxième, quatrième et cinquième éléments de la liste sont présélectionnés :
Effacer les sélections
Les SelectedItem
propriétés et SelectedItems
peuvent être effacées en les définissant, ou les objets auxquels elles se lient, sur null
.
Modifier la couleur de l’élément sélectionné
CollectionView
a un Selected
VisualState
qui peut être utilisé pour initier une modification visuelle de l’élément sélectionné dans le CollectionView
. Un cas VisualState
d’usage courant consiste à modifier la couleur d’arrière-plan de l’élément sélectionné, ce qui est illustré dans l’exemple XAML suivant :
<ContentPage ...>
<ContentPage.Resources>
<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>
</ContentPage.Resources>
<StackLayout Margin="20">
<CollectionView ItemsSource="{Binding Monkeys}"
SelectionMode="Single">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
...
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
</ContentPage>
Important
le Style
qui contient doit Selected
VisualState
avoir une TargetType
valeur de propriété qui correspond au type de l’élément racine du DataTemplate
, qui est défini comme valeur de propriété ItemTemplate
.
Dans cet exemple, la valeur de la Style.TargetType
propriété est définie sur Grid
, car l’élément racine de est ItemTemplate
un Grid
. spécifie Selected
VisualState
que lorsqu’un élément du CollectionView
est sélectionné, le BackgroundColor
de l’élément est défini sur LightSkyBlue
:
Pour plus d’informations sur les états visuels, consultez Xamarin.Forms Gestionnaire d’état visuel.
Désactiver la sélection
CollectionView
la sélection est désactivée par défaut. Toutefois, si une CollectionView
sélection est activée, elle peut être désactivée en définissant la SelectionMode
propriété sur None
:
<CollectionView ...
SelectionMode="None" />
Le code C# équivalent est :
CollectionView collectionView = new CollectionView
{
...
SelectionMode = SelectionMode.None
};
Lorsque la propriété a la SelectionMode
None
valeur , les éléments du CollectionView
ne peuvent pas être sélectionnés, la SelectedItem
propriété reste null
et l’événement SelectionChanged
n’est pas déclenché.
Notes
Lorsqu’un élément a été sélectionné et que la SelectionMode
propriété est remplacée par Single
, None
la SelectedItem
propriété est définie sur et l’événement SelectionChanged
est déclenché null
avec une propriété videCurrentSelection
.