Konfigurowanie wyboru elementu CollectionView
Interfejs użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) CollectionView definiuje następujące właściwości, które kontrolują wybór elementu:
SelectionMode
, typuSelectionMode
, tryb wyboru.SelectedItem
, typuobject
, wybrany element na liście. Ta właściwość ma domyślny trybTwoWay
powiązania elementu i manull
wartość, gdy nie wybrano żadnego elementu.SelectedItems
, typuIList<object>
, wybrane elementy na liście. Ta właściwość ma domyślny trybOneWay
powiązania elementu i manull
wartość, gdy nie wybrano żadnych elementów.SelectionChangedCommand
, typu ICommand, który jest wykonywany po zmianie wybranego elementu.SelectionChangedCommandParameter
, typuobject
, który jest parametrem przekazanym do .SelectionChangedCommand
Wszystkie te właściwości są wspierane przez BindableProperty obiekty, co oznacza, że właściwości mogą być obiektami docelowymi powiązań danych.
Domyślnie CollectionView zaznaczenie jest wyłączone. To zachowanie można jednak zmienić, ustawiając SelectionMode
wartość właściwości na jeden z SelectionMode
elementów członkowskich wyliczenia:
None
— wskazuje, że nie można wybrać elementów. Jest to wartość domyślna.Single
— wskazuje, że można wybrać pojedynczy element z wyróżnionym wybranym elementem.Multiple
— wskazuje, że można wybrać wiele elementów z wyróżnionymi wybranymi elementami.
CollectionViewSelectionChanged
Definiuje zdarzenie, które jest wyzwalane po SelectedItem
zmianie właściwości, albo z powodu wybrania elementu z listy przez użytkownika lub gdy aplikacja ustawia właściwość. Ponadto to zdarzenie jest również wyzwalane, gdy SelectedItems
właściwość ulegnie zmianie. ObiektSelectionChangedEventArgs
, który towarzyszy SelectionChanged
zdarzeniu ma dwie właściwości:IReadOnlyList<object>
PreviousSelection
— lista wybranych elementów przed zmianą zaznaczenia.CurrentSelection
— lista wybranych elementów po zmianie zaznaczenia.
Ponadto ma metodęUpdateSelectedItems
, CollectionView która aktualizuje SelectedItems
właściwość za pomocą listy wybranych elementów, jednocześnie wyzwalając tylko jedno powiadomienie o zmianie.
Wybór pojedynczy
Gdy właściwość jest ustawiona SelectionMode
na , można wybrać Single
pojedynczy element w elemencie CollectionView . Po wybraniu SelectedItem
elementu właściwość jest ustawiana na wartość wybranego elementu. Gdy ta właściwość ulegnie zmianie, SelectionChangedCommand
zostanie wykonana wartość (z wartością SelectionChangedCommandParameter
przekazywaną do ICommandobiektu ), a SelectionChanged
zdarzenie zostanie wyzwolone.
Poniższy przykład XAML przedstawia element CollectionView , który może reagować na wybór pojedynczego elementu:
<CollectionView ItemsSource="{Binding Monkeys}"
SelectionMode="Single"
SelectionChanged="OnCollectionViewSelectionChanged">
...
</CollectionView>
Równoważny kod języka C# to:
CollectionView collectionView = new CollectionView
{
SelectionMode = SelectionMode.Single
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
collectionView.SelectionChanged += OnCollectionViewSelectionChanged;
W tym przykładzie OnCollectionViewSelectionChanged
kodu program obsługi zdarzeń jest wykonywany, gdy SelectionChanged
zdarzenie jest uruchamiane, a program obsługi zdarzeń pobiera poprzednio wybrany element i bieżący wybrany element:
void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
string previous = (e.PreviousSelection.FirstOrDefault() as Monkey)?.Name;
string current = (e.CurrentSelection.FirstOrDefault() as Monkey)?.Name;
...
}
Ważne
Zdarzenie SelectionChanged
może zostać wyzwolone przez zmiany, które występują w wyniku zmiany SelectionMode
właściwości.
Poniższy zrzut ekranu przedstawia wybór pojedynczego elementu w elemencie CollectionView:
Wybór wielokrotny
Gdy właściwość jest ustawiona SelectionMode
na , można wybrać Multiple
wiele elementów w obiekcie CollectionView . Po wybraniu SelectedItems
elementów właściwość jest ustawiana na wybrane elementy. Gdy ta właściwość ulegnie zmianie, SelectionChangedCommand
zostanie wykonana wartość (z wartością SelectionChangedCommandParameter
przekazywaną do ICommandobiektu , a SelectionChanged
zdarzenie zostanie wyzwolone.
Poniższy przykład XAML przedstawia element CollectionView , który może reagować na wybór wielu elementów:
<CollectionView ItemsSource="{Binding Monkeys}"
SelectionMode="Multiple"
SelectionChanged="OnCollectionViewSelectionChanged">
...
</CollectionView>
Równoważny kod języka C# to:
CollectionView collectionView = new CollectionView
{
SelectionMode = SelectionMode.Multiple
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
collectionView.SelectionChanged += OnCollectionViewSelectionChanged;
W tym przykładzie OnCollectionViewSelectionChanged
kodu program obsługi zdarzeń jest wykonywany, gdy SelectionChanged
zdarzenie jest uruchamiane, a program obsługi zdarzeń pobiera wcześniej wybrane elementy i bieżące wybrane elementy:
void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var previous = e.PreviousSelection;
var current = e.CurrentSelection;
...
}
Ważne
Zdarzenie SelectionChanged
może zostać wyzwolone przez zmiany, które występują w wyniku zmiany SelectionMode
właściwości.
Poniższy zrzut ekranu przedstawia wybór wielu elementów w elemencie CollectionView:
Pojedynczy wybór wstępny
SelectionMode
Gdy właściwość jest ustawiona na Single
, pojedynczy element w elemencie CollectionView można wstępnie wybrać, ustawiając SelectedItem
właściwość na element. Poniższy przykład XAML przedstawia element CollectionView , który wstępnie zaznacza pojedynczy element:
<CollectionView ItemsSource="{Binding Monkeys}"
SelectionMode="Single"
SelectedItem="{Binding SelectedMonkey}">
...
</CollectionView>
Równoważny kod języka C# to:
CollectionView collectionView = new CollectionView
{
SelectionMode = SelectionMode.Single
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
collectionView.SetBinding(SelectableItemsView.SelectedItemProperty, "SelectedMonkey");
Uwaga
Właściwość SelectedItem
ma domyślny tryb TwoWay
powiązania .
SelectedItem
Dane właściwości są powiązane z właściwością SelectedMonkey
połączonego modelu widoku, który jest typu Monkey
. Domyślnie jest używane powiązanie, TwoWay
aby jeśli użytkownik zmieni wybrany element, wartość SelectedMonkey
właściwości jest ustawiona na wybrany Monkey
obiekt. Właściwość SelectedMonkey
jest definiowana MonkeysViewModel
w klasie i jest ustawiona na czwarty element kolekcji Monkeys
:
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();
}
...
}
W związku z tym po wyświetleniu CollectionView elementu czwarty element na liście jest wstępnie wybrany:
Wybór wielokrotny
Gdy właściwość jest ustawiona SelectionMode
na , można wstępnie wybrać Multiple
wiele elementów w elemecie CollectionView . Poniższy przykład XAML przedstawia element CollectionView , który umożliwia wstępne wybór wielu elementów:
<CollectionView x:Name="collectionView"
ItemsSource="{Binding Monkeys}"
SelectionMode="Multiple"
SelectedItems="{Binding SelectedMonkeys}">
...
</CollectionView>
Równoważny kod języka C# to:
CollectionView collectionView = new CollectionView
{
SelectionMode = SelectionMode.Multiple
};
collectionView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
collectionView.SetBinding(SelectableItemsView.SelectedItemsProperty, "SelectedMonkeys");
Uwaga
Właściwość SelectedItems
ma domyślny tryb OneWay
powiązania .
SelectedItems
Dane właściwości są powiązane z właściwością SelectedMonkeys
połączonego modelu widoku, który jest typu ObservableCollection<object>
. Właściwość SelectedMonkeys
jest definiowana MonkeysViewModel
w klasie i jest ustawiona na drugie, czwarte i piąte elementy w Monkeys
kolekcji:
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]
};
}
...
}
}
W związku z CollectionView tym po wyświetleniu drugie, czwarte i piąte elementy na liście są wstępnie zaznaczone:
Wyczyść zaznaczenie
Właściwości SelectedItem
i SelectedItems
można wyczyścić, ustawiając je lub obiekty, z którymi są powiązane, na null
. Po wyczyszczonej SelectionChanged
jednej z tych właściwości zdarzenie jest wywoływane z pustą CurrentSelection
właściwością i SelectionChangedCommand
jest wykonywane.
Obsługa ponownego wybierania
Typowy scenariusz polega na tym, że użytkownicy będą wybierać element w elemencie CollectionView
, a następnie przechodzić do innej strony. Po powrocie do elementu jest nadal zaznaczony, co spowoduje, że nie będą mogli ponownie wybrać danego elementu. Aby włączyć ponowne zaznaczenie, należy wyczyścić zaznaczenie elementu w elemencie CollectionView
:
<CollectionView ...
SelectionChanged="OnCollectionViewSelectionChanged" />
Równoważny kod języka C# to:
CollectionView collectionView = new CollectionView();
collectionView.SelectionChanged += OnCollectionViewSelectionChanged;
W poniższym przykładzie pokazano kod procedury obsługi zdarzeń SelectionChanged
dla zdarzenia:
void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var cv = (CollectionView)sender;
if (cv.SelectedItem == null)
return;
cv.SelectedItem = null;
}
Zmień kolor zaznaczonego elementu
CollectionView element ma element Selected
VisualState , którego można użyć do zainicjowania zmiany wizualizacji w wybranym elemencie w elemencie CollectionView. Typowym przypadkiem VisualState użycia jest zmiana koloru tła wybranego elementu, który jest pokazany w poniższym przykładzie XAML:
<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>
<Grid Margin="20">
<CollectionView ItemsSource="{Binding Monkeys}"
SelectionMode="Single">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
...
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
</ContentPage>
Ważne
Element Style zawierający VisualState Selected
element musi mieć TargetType
wartość właściwości, która jest typem elementu głównego elementu DataTemplate, który jest ustawiany jako ItemTemplate
wartość właściwości.
Odpowiedni kod języka C# dla stylu zawierającego stan wizualizacji to:
using static Microsoft.Maui.Controls.VisualStateManager;
...
Setter backgroundColorSetter = new() { Property = BackgroundColorProperty, Value = Colors.LightSkyBlue };
VisualState stateSelected = new() { Name = CommonStates.Selected, Setters = { backgroundColorSetter } };
VisualState stateNormal = new() { Name = CommonStates.Normal };
VisualStateGroup visualStateGroup = new() { Name = nameof(CommonStates), States = { stateSelected, stateNormal } };
VisualStateGroupList visualStateGroupList = new() { visualStateGroup };
Setter vsgSetter = new() { Property = VisualStateGroupsProperty, Value = visualStateGroupList };
Style style = new(typeof(Grid)) { Setters = { vsgSetter } };
// Add the style to the resource dictionary
Resources.Add(style);
W tym przykładzie Style.TargetType
wartość właściwości jest ustawiona na Grid , ponieważ element główny obiektu ItemTemplate
to Grid. Określa Selected
VisualState, BackgroundColor
że po wybraniu elementu w elemencie CollectionView element jest ustawiony na LightSkyBlue
wartość :
Aby uzyskać więcej informacji na temat stanów wizualizacji, zobacz Visual states (Stany wizualizacji).
Wyłączanie zaznaczenia
CollectionView zaznaczenie jest domyślnie wyłączone. Jeśli CollectionView jednak zaznaczony element jest włączony, można go wyłączyć, ustawiając SelectionMode
właściwość na None
wartość :
<CollectionView ...
SelectionMode="None" />
Równoważny kod języka C# to:
CollectionView collectionView = new CollectionView
{
...
SelectionMode = SelectionMode.None
};
SelectionMode
Gdy właściwość jest ustawiona na , nie można wybrać SelectedItem
None
elementów, CollectionView właściwość pozostaje null
, a SelectionChanged
zdarzenie nie zostanie wyzwolone.
Uwaga
Po wybraniu elementu i SelectionMode
zmianie właściwości z Single
na None
, właściwość zostanie ustawiona na null
, SelectedItem
a SelectionChanged
zdarzenie zostanie wyzwolone z pustą CurrentSelection
właściwością.