0Pricing
C# Academy · Lekcja

Wiązanie danych i obsługa zdarzeń

Stosuj jednokierunkowe i dwukierunkowe wiązanie danych, obsługuj zdarzenia DOM i komponentów oraz używaj EventCallback.

Wiązanie danych i obsługa zdarzeń to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Wiązanie danych w Blazor

Blazor obsługuje trzy kierunki wiązania: jednokierunkowe (tylko do odczytu, @expr), oparte na zdarzeniach (@onclick itd.) oraz dwukierunkowe (@bind). Razem stanowią one podstawę reaktywnych interfejsów użytkownika.

Jednokierunkowe wiązanie danych

Wystarczy umieścić wyrażenie C# w znacznikach za pomocą @. Wartość jest aktualizowana przy każdym ponownym renderowaniu komponentu, ale DOM nie może przekazywać wartości z powrotem do 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; }
}

Wiązanie dwukierunkowe za pomocą @bind

@bind łączy element wejściowy z polem, korzystając zarówno z ustawiania właściwości, jak i ze zdarzeń zmiany. Działa z tekstem, liczbami, datami, polami wyboru i listami wyboru.

<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 z niestandardowym zdarzeniem

Domyślnie @bind używa zdarzenia onchange. Za pomocą @bind:event można je zmienić — na przykład oninput jest wywoływane po każdym naciśnięciu klawisza, co umożliwia wyszukiwanie na żywo.

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

Obsługa zdarzeń za pomocą @onclick

Należy używać @onclick (oraz innych dyrektyw zdarzeń DOM), aby dołączać delegaty C# do zdarzeń DOM. Działają zarówno metody synchroniczne, jak i zadania asynchroniczne.

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

Argumenty zdarzeń

Zdarzenia DOM udostępniają obiekty argumentów zdarzeń. W procedurze obsługi należy zadeklarować odpowiedni typ argumentu, aby uzyskać dostęp między innymi do współrzędnych, kodów klawiszy i wartości pól wejściowych.

<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 w komunikacji komponentu nadrzędnego z podrzędnym

EventCallback to sposób Blazor na komunikację komponentu podrzędnego z nadrzędnym. W przeciwieństwie do zwykłego Action/Func automatycznie wywołuje StateHasChanged w komponencie nadrzędnym i poprawnie obsługuje wyjątki.

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

Zapobieganie działaniu domyślnemu i zatrzymywanie propagacji

Należy użyć @onclick:preventDefault, aby anulować domyślne działanie przeglądarki, oraz @onclick:stopPropagation, aby zatrzymać propagację zdarzenia.

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

Wiązanie dwukierunkowe za pomocą @bind-Value w niestandardowych komponentach

Należy zaimplementować wzorzec Value/ValueChanged w niestandardowym komponencie, aby obsługiwać @bind-Value z komponentu nadrzędnego — jest to standardowy kontrakt wiązania dwukierunkowego w 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" />

Debouncing zdarzeń wejściowych

W przypadku kosztownych operacji wywoływanych przez dane wprowadzane przez użytkownika (wywołania API, intensywne filtrowanie) należy zastosować mechanizm debounce, używając CancellationTokenSource, aby opóźnić wykonanie do czasu, aż użytkownik przestanie pisać.

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

Szybkie sprawdzenie

Jaka jest przewaga EventCallback nad Action/Func w przypadku zdarzeń przekazywanych z komponentu podrzędnego do nadrzędnego w Blazor?

Podsumowanie: wiązanie danych i obsługa zdarzeń

Najważniejsze informacje:

  • Wiązanie jednokierunkowe: wyrażenia C# należy wyświetlać za pomocą @expr
  • Wiązanie dwukierunkowe: należy używać @bind dla elementów wejściowych; @bind:event zmienia wyzwalające zdarzenie
  • Zdarzenia DOM: @onclick, @oninput, @onkeydown z typowanymi argumentami zdarzeń
  • EventCallback<T>: komunikacja komponentu podrzędnego z nadrzędnym z automatycznym wywołaniem StateHasChanged
  • W przypadku niestandardowego wiązania dwukierunkowego komponentu należy zaimplementować Value/ValueChanged
  • Należy stosować debounce dla kosztownych operacji, aby ograniczyć liczbę niepotrzebnych wywołań API

Często zadawane pytania

Czy lekcja „Wiązanie danych i obsługa zdarzeń” jest bezpłatna?

Tak — pełny tekst „Wiązanie danych i obsługa zdarzeń” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wiązanie danych i obsługa zdarzeń”?

Stosuj jednokierunkowe i dwukierunkowe wiązanie danych, obsługuj zdarzenia DOM i komponentów oraz używaj EventCallback. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Wiązanie danych i obsługa zdarzeń”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Model komponentów Blazor
  2. Wiązanie danych i obsługa zdarzeń
  3. Komunikacja komponentów i DI
  4. Zarządzanie stanem w Blazor
← Powrót do C# Academy