0Pricing
C# Academy · Leçon

Liaison de données et gestion des événements

Appliquez la liaison de données à sens unique et à double sens, gérez les événements du DOM et des composants, puis utilisez EventCallback.

Liaison de données et gestion des événements est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Liaison de données dans Blazor

Blazor prend en charge trois directions de liaison : unidirectionnelle (en lecture seule, @expr), fondée sur les événements (@onclick, etc.) et bidirectionnelle (@bind). Ensemble, elles constituent le fondement des interfaces réactives.

Liaison de données unidirectionnelle

Affichez simplement une expression C# dans le balisage à l’aide de @. La valeur est mise à jour chaque fois que le composant est rendu, mais le DOM ne peut pas renvoyer de valeurs au C#.

<!-- One-way: C# -> DOM -->
<p>Count: @_count</p>
<p>Full name: @($"{_firstName} {_lastName}")</p>
<p>Price: @Price.ToString("C")</p>

@code {
    private int _count = 0;
    private string _firstName = "Alice";
    private string _lastName = "Smith";
    [Parameter] public decimal Price { get; set; }
}

Liaison bidirectionnelle avec @bind

@bind relie un élément de saisie à un champ en utilisant à la fois l’affectation de propriété et les événements de modification. Cela fonctionne avec le texte, les nombres, les dates, les cases à cocher et les listes déroulantes.

<input @bind="_name" placeholder="Enter name" />
<input type="number" @bind="_quantity" />
<input type="date" @bind="_dueDate" />
<input type="checkbox" @bind="_isActive" />

<p>Name: @_name | Qty: @_quantity | Active: @_isActive</p>

@code {
    private string _name = "";
    private int _quantity = 1;
    private DateTime _dueDate = DateTime.Today;
    private bool _isActive = true;
}

@bind avec un événement personnalisé

Par défaut, @bind utilise l’événement onchange. Utilisez @bind:event pour le modifier ; par exemple, oninput se déclenche à chaque frappe pour effectuer une recherche en temps réel.

@* Updates on every keystroke instead of on focus-loss *@
<input @bind="_search"
       @bind:event="oninput"
       placeholder="Live search..." />

<ul>
    @foreach (var item in Filtered)
    {
        <li>@item</li>
    }
</ul>

@code {
    private string _search = "";
    private string[] Items = { "Apple", "Banana", "Cherry", "Avocado" };
    private IEnumerable<string> Filtered =>
        Items.Where(i => i.Contains(_search, StringComparison.OrdinalIgnoreCase));
}

Gestion des événements avec @onclick

Utilisez @onclick et les autres directives d’événements du DOM pour associer des délégués C# aux événements du DOM. Les méthodes synchrones comme les tâches async fonctionnent toutes deux.

<button @onclick="Increment">+</button>
<button @onclick="DecrementAsync">-</button>
<button @onclick="() => _count = 0">Reset</button>
<p>Count: @_count</p>

@code {
    private int _count = 0;

    private void Increment() => _count++;

    private async Task DecrementAsync()
    {
        await Task.Delay(200); // simulate async work
        _count--;
    }
}

Arguments d’événement

Les événements du DOM fournissent des objets contenant les arguments de l’événement. Déclarez le type d’argument approprié dans votre gestionnaire pour accéder aux coordonnées, aux codes des touches, aux valeurs saisies, etc.

<input @onkeydown="OnKeyDown" @onfocus="OnFocus" />
<div @onmousemove="OnMouseMove">Move here</div>
<p>@_info</p>

@code {
    private string _info = "";

    private void OnKeyDown(KeyboardEventArgs e)
        => _info = $"Key: {e.Key} (Ctrl={e.CtrlKey})";

    private void OnFocus(FocusEventArgs e)
        => _info = "Input focused";

    private void OnMouseMove(MouseEventArgs e)
        => _info = $"Mouse: ({e.ClientX}, {e.ClientY})";
}

EventCallback pour la communication parent-enfant

EventCallback est le mécanisme Blazor prévu pour la communication de l’enfant vers le parent. Contrairement à une Action/Func classique, il déclenche automatiquement StateHasChanged sur le parent et gère correctement les exceptions.

@* Child: ProductCard.razor *@
<button @onclick="() => OnBuy.InvokeAsync(Product)">Buy</button>

@code {
    [Parameter] public Product Product { get; set; } = default!;
    [Parameter] public EventCallback<Product> OnBuy { get; set; }
}

@* Parent: *@
<ProductCard Product="p" OnBuy="HandleBuy" />

@code {
    private async Task HandleBuy(Product p)
    {
        await CartService.AddAsync(p);
        // Parent re-renders automatically
    }
}

Empêcher l’action par défaut et arrêter la propagation

Utilisez @onclick:preventDefault pour annuler l’action par défaut du navigateur et @onclick:stopPropagation pour arrêter la propagation de l’événement.

@* Prevent form submission *@
<form @onsubmit="HandleSubmit" @onsubmit:preventDefault>
    <input @bind="_value" />
    <button type="submit">Save</button>
</form>

@* Stop click from bubbling to parent div *@
<div @onclick="ParentClicked">
    <button @onclick="ChildClicked"
            @onclick:stopPropagation>
        Click me
    </button>
</div>

Liaison bidirectionnelle avec @bind-Value sur des composants personnalisés

Implémentez le modèle Value/ValueChanged sur un composant personnalisé afin de prendre en charge @bind-Value depuis le parent : il s’agit du contrat standard de liaison bidirectionnelle de Blazor.

@* RatingInput.razor *@
@for (int i = 1; i <= 5; i++)
{
    int star = i;
    <span class="@(star <= Value ? "filled" : "")"
          @onclick="() => ValueChanged.InvokeAsync(star)">★</span>
}

@code {
    [Parameter] public int Value { get; set; }
    [Parameter] public EventCallback<int> ValueChanged { get; set; }
}

@* Usage: *@
<RatingInput @bind-Value="_rating" />

Temporisation des événements de saisie

Pour les opérations coûteuses déclenchées par la saisie utilisateur (appels d’API, filtrage lourd), temporisez l’événement à l’aide d’un CancellationTokenSource afin de retarder l’exécution jusqu’à ce que l’utilisateur cesse de taper.

@code {
    private string _query = "";
    private CancellationTokenSource? _cts;

    private async Task OnSearchInput(ChangeEventArgs e)
    {
        _query = e.Value?.ToString() ?? "";
        _cts?.Cancel();
        _cts = new CancellationTokenSource();

        try
        {
            await Task.Delay(300, _cts.Token); // wait 300ms
            Results = await SearchService.SearchAsync(_query);
        }
        catch (TaskCanceledException) { /* user still typing */ }
    }

    private List<string> Results = new();
}

Vérification rapide

Quel est l’avantage d’EventCallback par rapport à Action/Func pour les événements transmis de l’enfant vers le parent dans Blazor ?

Récapitulatif : liaison de données et gestion des événements

À retenir :

  • Liaison unidirectionnelle : affichez les expressions C# avec @expr
  • Liaison bidirectionnelle : utilisez @bind sur les champs de saisie ; @bind:event modifie le déclencheur
  • Événements du DOM : @onclick, @oninput, @onkeydown avec des arguments d’événement typés
  • EventCallback<T> : communication de l’enfant vers le parent avec appel automatique à StateHasChanged
  • Implémentez Value/ValueChanged pour la liaison bidirectionnelle des composants personnalisés
  • Temporisez les opérations coûteuses afin de réduire les appels d’API inutiles

Questions Fréquemment Posées

La leçon « Liaison de données et gestion des événements » est-elle gratuite ?

Oui — le texte complet de « Liaison de données et gestion des événements » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Liaison de données et gestion des événements » ?

Appliquez la liaison de données à sens unique et à double sens, gérez les événements du DOM et des composants, puis utilisez EventCallback. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Liaison de données et gestion des événements » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Modèle de composants Blazor
  2. Liaison de données et gestion des événements
  3. Communication entre composants et DI
  4. Gestion de l’état dans Blazor
← Retour à C# Academy