0Pricing
C# Academy · Aula

Vinculação de dados e tratamento de eventos

Aplique vinculação de dados unidirecional e bidirecional, trate eventos do DOM e dos componentes e use EventCallback.

Vinculação de dados e tratamento de eventos é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

Vinculação no Blazor

O Blazor oferece três direções de vinculação: unidirecional (somente leitura, @expr), baseada em eventos (@onclick etc.) e bidirecional (@bind). Juntas, elas formam a base das interfaces reativas.

Vinculação de dados unidirecional

Basta gerar uma expressão C# na marcação usando @. O valor é atualizado sempre que o componente é renderizado novamente, mas o DOM não pode enviar valores de volta para 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; }
}

Vinculação bidirecional com @bind

@bind conecta um elemento de entrada a um campo usando tanto a atribuição da propriedade quanto eventos de alteração. Funciona com texto, números, datas, caixas de seleção e listas suspensas.

<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 com evento personalizado

Por padrão, @bind usa o evento onchange. Use @bind:event para alterá-lo — por exemplo, oninput é disparado a cada tecla pressionada para realizar pesquisas em tempo real.

@* 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));
}

Tratamento de eventos com @onclick

Use @onclick (e outras diretivas de eventos do DOM) para associar delegados C# a eventos do DOM. Tanto métodos síncronos quanto tarefas assíncronas funcionam.

<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--;
    }
}

Argumentos de eventos

Os eventos do DOM fornecem objetos de argumentos de evento. Declare o tipo de argumento apropriado no manipulador para acessar coordenadas, códigos de teclas, valores de entrada 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 para comunicação entre pai e filho

EventCallback é a forma do Blazor de fazer a comunicação do filho com o pai. Ao contrário de uma Action/Func comum, ele dispara automaticamente StateHasChanged no pai e trata exceções corretamente.

@* 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
    }
}

Impedindo a ação padrão e interrompendo a propagação

Use @onclick:preventDefault para cancelar a ação padrão do navegador e @onclick:stopPropagation para interromper a propagação do evento.

@* 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>

Vinculação bidirecional com @bind-Value em componentes personalizados

Implemente o padrão Value/ValueChanged em um componente personalizado para aceitar @bind-Value do componente pai — o contrato padrão de vinculação bidirecional do 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" />

Atrasando eventos de entrada

Para operações dispendiosas acionadas pela entrada do usuário (chamadas à API, filtragem intensa), aplique um atraso ao evento usando um CancellationTokenSource para adiar a execução até que o usuário pare de digitar.

@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();
}

Verificação rápida

Qual é a vantagem de EventCallback em relação a Action/Func para eventos do filho para o pai no Blazor?

Recapitulação: vinculação de dados e tratamento de eventos

Principais conclusões:

  • Vinculação unidirecional: gere expressões C# com @expr
  • Vinculação bidirecional: use @bind nas entradas; @bind:event altera o gatilho
  • Eventos do DOM: @onclick, @oninput, @onkeydown com argumentos de evento tipados
  • EventCallback<T>: comunicação do filho com o pai com StateHasChanged automático
  • Implemente Value/ValueChanged para a vinculação bidirecional de componentes personalizados
  • Aplique um atraso a operações dispendiosas para reduzir chamadas desnecessárias à API

Perguntas Frequentes

A aula “Vinculação de dados e tratamento de eventos” é grátis?

Sim — o texto completo de “Vinculação de dados e tratamento de eventos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Vinculação de dados e tratamento de eventos”?

Aplique vinculação de dados unidirecional e bidirecional, trate eventos do DOM e dos componentes e use EventCallback. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Vinculação de dados e tratamento de eventos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Modelo de componentes do Blazor
  2. Vinculação de dados e tratamento de eventos
  3. Comunicação entre componentes e DI
  4. Gerenciamento de estado no Blazor
← Voltar para C# Academy