LgSelect
LgSelect<TValue> est la liste déroulante à sélection unique. Les
options se déclarent en markup dans <Items> (avec LgOptionListItem), ou
proviennent d'une source de données (DataSourceItems / DataSource) ; une
zone de recherche intégrée peut filtrer les options.
<LgSelect Label="#Color" Placeholder="#ChooseColor" @bind-Value="_model.Color">
<Items>
<LgOptionListItem Text="#Blue" Value="@("blue")" />
<LgOptionListItem Text="#Green" Value="@("green")" />
</Items>
</LgSelect>
- Espace de noms :
Lagoon.UI.Components - Hérite de :
LgSelectBase<TValue, TValue>→LgInputRenderBase<TValue>→LgInputBase<TValue>→LgAriaComponentBase→LgComponentBase - Package NuGet :
Lagoon.UI
Pour lier une collection de valeurs, utilisez LgSelectMultiple
(Référence API). Pour une saisie libre
assistée de suggestions, utilisez LgSuggestBox.
Utilisation
Démonstration
Essayez ce composant dans le showcase Lagoon.
Options en markup
Chaque option est un LgOptionListItem portant son texte et sa valeur.
<LgSelect Label="#Color" Placeholder="#ChooseColor" @bind-Value="_model.Color">
<Items>
@foreach (ColorItem item in _colors)
{
<LgOptionListItem Text="@item.Label" Value="@item.Value" />
}
</Items>
</LgSelect>
public partial class ColorSelectPage : LgPage
{
// Options affichées : le couple libellé / valeur alimente les LgOptionListItem.
private readonly List<ColorItem> _colors = new()
{
new ColorItem("Bleu", "blue"),
new ColorItem("Vert", "green"),
new ColorItem("Rouge", "red")
};
private readonly ColorVm _model = new();
private sealed record ColorItem(string Label, string Value);
private sealed class ColorVm
{
public string Color { get; set; }
}
}
Alimentation par une source de données
DataSourceItems alimente la liste depuis une collection ; DataSource
(IListDataSource) prend en charge les scénarios avancés (texte / valeur
séparés, chargement à la demande) — voir la
Référence API pour les types attendus.
<LgSelect Label="#Country"
DataSourceItems="_countries"
@bind-Value="_model.Country" />
public partial class CountrySelectPage : LgPage
{
// Source de données directe : chaque élément est à la fois le texte et la valeur.
private readonly List<string> _countries = new() { "France", "Allemagne", "Espagne", "Italie" };
private readonly CountryVm _model = new();
private sealed class CountryVm
{
public string Country { get; set; }
}
}
Source distante et selects en cascade
RemoteListDataSource<TItem, TValue> charge les options depuis une action de
contrôleur [Queryable] (voir Attribut Queryable) :
TItem est le type renvoyé par le serveur (un view model), TValue le type
de la valeur liée, et les deux sélecteurs extraient la valeur et le texte de
chaque élément. ControllerQueryArg transmet au contrôleur un argument métier,
reçu dans un QueryArg<T>.
Pour un select qui dépend d'un autre (les sociétés du pays choisi), il suffit
de modifier ControllerQueryArg de la source : le select recharge sa liste
avec le nouvel argument.
<LgSelect Label="#Country"
DataSource="_countriesDataSource"
OnChange="OnCountryChanged"
@bind-Value="_model.CountryId" />
<LgSelect Label="#Firm"
DataSource="_firmsDataSource"
@bind-Value="_model.FirmId" />
public partial class FirmSelectPage : LgPage
{
private readonly FirmVm _model = new();
private RemoteListDataSource<VmCountry, int?> _countriesDataSource;
private RemoteListDataSource<VmCountryFirm, Guid?> _firmsDataSource;
protected override void OnInitialized()
{
base.OnInitialized();
_countriesDataSource = new RemoteListDataSource<VmCountry, int?>(
"api/Countries/names", x => x.Id, x => x.Name);
// Argument reçu par l'action GetFirmsByCountry dans un QueryArg<int?>.
_firmsDataSource = new RemoteListDataSource<VmCountryFirm, Guid?>(
"api/Firms/GetFirmsByCountry", x => x.Id, x => x.FirmName)
{
ControllerQueryArg = _model.CountryId
};
}
private Task OnCountryChanged()
{
// La société sélectionnée appartient au pays précédent : on l'efface.
_model.FirmId = null;
// Changer l'argument suffit à recharger la liste des sociétés.
_firmsDataSource.ControllerQueryArg = _model.CountryId;
return Task.CompletedTask;
}
private sealed class FirmVm
{
public int? CountryId { get; set; }
public Guid? FirmId { get; set; }
}
}
Quand ControllerQueryArg change (une affectation de la même valeur est
ignorée), le select abandonne sa liste et la redemande au serveur :
- tout de suite si la liste est ouverte, si un chargement est en cours (il est annulé puis relancé avec le nouvel argument : la réponse obsolète n'est jamais affichée) ou s'il reste le libellé d'une valeur sélectionnée à résoudre ;
- sinon à la prochaine ouverture de la liste, sans requête inutile.
ResetDataSource()- La valeur sélectionnée n'est pas effacée quand l'argument change : si
elle n'appartient plus à la nouvelle liste, remettez-la à
nulldans le gestionnaire qui change l'argument (commeOnCountryChangedci-dessus). - N'appelez pas
ResetDataSource()avant ou après avoir modifiéControllerQueryArg: le changement d'argument recharge déjà le select. Appelé juste avant,ResetDataSource()peut envoyer une requête avec l'ancien argument, aussitôt annulée. RéservezResetDataSource()au rechargement sans changement d'argument (données modifiées côté serveur, par exemple).
Le même fonctionnement s'applique à LgSelectMultiple.
Recherche dans les options
ShowSearchBox affiche la zone de recherche, MinSearchCharacter fixe le
nombre de caractères avant filtrage et OnFilterChange notifie chaque
recherche (utile pour recharger une source à la demande).
<LgSelect Label="#City"
ShowSearchBox="true"
MinSearchCharacter="2"
OnFilterChange="OnFilterChangeAsync"
DataSourceItems="_cities"
@bind-Value="_model.City" />
public partial class CitySelectPage : LgPage
{
private List<string> _cities = new() { "Paris", "Lyon", "Marseille" };
private readonly CityVm _model = new();
// Déclenché à chaque recherche : point d'entrée pour recharger la source à la demande.
private async Task OnFilterChangeAsync(FilterChangeEventArgs args)
{
await Task.Delay(100);
ShowInformation("#SearchDone");
}
private sealed class CityVm
{
public string City { get; set; }
}
}
Annuler un changement de sélection
OnChangingAsync est appelé avant l'affectation et permet d'annuler le
changement (args.Cancel) ; OnChange (hérité) est appelé après.
<LgSelect Label="#Status"
OnChangingAsync="OnStatusChangingAsync"
@bind-Value="_model.Status">
<Items>
<LgOptionListItem Text="#Draft" Value="@("draft")" />
<LgOptionListItem Text="#Published" Value="@("published")" />
<LgOptionListItem Text="#Archived" Value="@("archived")" />
</Items>
</LgSelect>
public partial class StatusSelectPage : LgPage
{
private readonly StatusVm _model = new();
// Appelé avant le changement : interdit l'archivage direct depuis le brouillon.
private Task OnStatusChangingAsync(ChangingEventArgs<string> args)
{
if (args.OldValue == "draft" && args.NewValue == "archived")
{
args.Cancel = true;
ShowWarning("#PublishBeforeArchive");
}
return Task.CompletedTask;
}
private sealed class StatusVm
{
public string Status { get; set; } = "draft";
}
}
Propriétés
Toutes les propriétés [Parameter] du composant, y compris celles héritées.
| Nom | Type | Défaut | Déclaré dans | Description |
|---|---|---|---|---|
OnChangingAsync | Func<ChangingEventArgs<TValue>, Task> | null | LgSelect | Callback appelé avant le changement de valeur ; le changement peut y être annulé. |
DataSource | IListDataSource<TValue> | null | LgSelectBase | Source de données de la liste (texte / valeur séparés, chargement à la demande). |
DataSourceItems | IEnumerable<TValue> | null | LgSelectBase | Éléments de la liste fournis directement. |
DropDownMaxHeight | int | 0 | LgSelectBase | Hauteur maximale de la liste déroulante, en pixels. Si 0 ou moins, la configuration de l'application s'applique. |
InputMask | string | null | LgSelectBase | Masque de saisie appliqué à la zone de recherche. |
InputMaskKind | InputMaskKind | None | LgSelectBase | Type de masque de saisie de la zone de recherche. |
InputMaskPlaceholder | string | null | LgSelectBase | Caractère remplissant les positions vides du masque de saisie (par exemple # avec le masque 99-99-99-99-99 affiche ##-##-##-##-##). À ne pas confondre avec Placeholder. Sans valeur, le caractère par défaut du masque (_) est conservé. S'applique à la zone de recherche du menu déroulant. |
Items | RenderFragment | null | LgSelectBase | Options déclarées en markup (LgOptionListItem). |
MinSearchCharacter | int | 0 | LgSelectBase | Nombre minimal de caractères avant filtrage (et avant OnFilterChange en chargement à la demande). |
OnFilterChange | EventCallback<FilterChangeEventArgs> | — | LgSelectBase | Callback déclenché quand l'utilisateur fait une recherche. |
Placeholder | string | null | LgSelectBase | Texte affiché quand aucune valeur n'est sélectionnée. Distinct de InputMaskPlaceholder. |
SearchBoxCssClass | string | null | LgSelectBase | Classes CSS additionnelles de la zone de recherche. |
ShowSearchBox | bool? | null | LgSelectBase | Affiche la zone de recherche. Si null, la configuration de l'application s'applique. |
SuffixSearchBox | string | null | LgSelectBase | Suffixe de la zone de recherche. |
SuffixTypeSearchBox | InputLabelType | IconName | LgSelectBase | Nature du suffixe de la zone de recherche. |
Prefix | string | null | LgInputRenderBase | Préfixe affiché dans le champ. |
PrefixType | InputLabelType | Text | LgInputRenderBase | Nature du préfixe. |
Suffix | string | null | LgInputRenderBase | Suffixe affiché dans le champ. |
SuffixType | InputLabelType | Text | LgInputRenderBase | Nature du suffixe. |
AdditionalAttributes | IReadOnlyDictionary<string, object> | null | LgInputBase | Attributs HTML additionnels appliqués à l'élément rendu. |
AutoFocus | bool | false | LgInputBase | Donne le focus au champ lors du premier rendu. |
ConfirmationMessage | string | null | LgInputBase | Message de confirmation affiché avant d'appliquer un changement de sélection. |
Container | IInputContainer<TValue> | null | LgInputBase | Usage interne : rattache une cellule de GridView au champ. |
CssClass | string | null | LgInputBase | Classes CSS additionnelles. |
Disabled | bool | false | LgInputBase | Désactive le champ. |
DisplayName | string | null | LgInputBase | Nom du champ utilisé dans les messages d'erreur. |
HideValidationMessage | bool | false | LgInputBase | Masque le message de validation sous le champ. |
Label | string | null | LgInputBase | Libellé du champ. |
LabelContent | RenderFragment | null | LgInputBase | Contenu personnalisé de la zone de libellé. |
OnChange | EventCallback<ChangeEventArgs> | — | LgInputBase | Callback appelé après le changement de sélection. |
OnReset | EventCallback<ChangeEventArgs> | — | LgInputBase | Callback appelé quand la sélection est effacée par le bouton d'effacement. |
PolicyEdit | string | null | LgInputBase | Policy requise pour modifier le champ. |
PolicyVisible | string | null | LgInputBase | Policy requise pour afficher le champ. |
ReadOnly | bool | false | LgInputBase | Affiche la sélection en lecture seule. |
Required | bool? | null | LgInputBase | Champ obligatoire. Si null, déduit de l'attribut [Required] de la propriété liée. Un champ obligatoire n'affiche pas le bouton d'effacement. |
ResetButton | bool? | null | LgInputBase | Affiche le bouton d'effacement de la sélection. Si null, la configuration de comportement de l'application s'applique. |
ResetText | string | null | LgInputBase | Texte du bouton d'effacement. |
ResetTextAriaLabel | string | null | LgInputBase | Libellé accessible (aria-label) du bouton d'effacement. |
Tooltip | string | null | LgInputBase | Bulle d'aide. |
TooltipIsHtml | bool | false | LgInputBase | Indique si le contenu du Tooltip est au format HTML (sinon texte brut). |
Value | TValue | — | LgInputBase | Valeur sélectionnée (@bind-Value). |
ValueChanged | EventCallback<TValue> | — | LgInputBase | Callback de mise à jour de la valeur liée. |
ValueExpression | Expression<Func<TValue>> | — | LgInputBase | Expression identifiant la propriété liée. |
AriaLabel | string | null | LgAriaComponentBase | Valeur de l'attribut aria-label. |
AriaLabelledBy | string | null | LgAriaComponentBase | Valeur de l'attribut aria-labelledby. |
LgSelect consomme aussi des paramètres fournis automatiquement par des
composants ancêtres (vous n'avez pas à les définir) : ParentAuthorizeView
(LgAuthorizeView) et le contexte d'édition d'un LgEditForm parent.
Événements
| Événement | Type | Description |
|---|---|---|
OnChangingAsync | Func<ChangingEventArgs<TValue>, Task> | Avant le changement de sélection ; args.Cancel = true l'annule. |
OnChange | EventCallback<ChangeEventArgs> | Après le changement de sélection. |
OnFilterChange | EventCallback<FilterChangeEventArgs> | Quand l'utilisateur fait une recherche dans la liste. |
OnReset | EventCallback<ChangeEventArgs> | Quand la sélection est effacée par le bouton d'effacement. |
Énumérations associées
Les énumérations utilisées sont documentées sur les composants de base :
InputMaskKind sur
LgTextBox et
InputLabelType sur
LgDateBox.
Bonnes pratiques / accessibilité
- Activez
ShowSearchBoxdès que la liste dépasse une dizaine d'options. - Utilisez
DataSource(plutôt queDataSourceItems) quand le texte affiché diffère de la valeur stockée ou que la liste se charge à la demande. - Pour peu d'options toujours visibles, préférez
LgRadioGroup.
Tous les paramètres (hérités compris) : Référence API — LgSelect. Pour la sélection multiple, voir LgSelectMultiple. Pour une saisie libre assistée de suggestions, voir LgSuggestBox.
Composants liés
LgSuggestBox— saisie libre avec suggestions.LgRadioGroup— choix unique par boutons radio.LgCheckBoxList— sélection multiple par cases à cocher.LgGridSelectColumn— colonne liée à une source de données dans unLgGridView.