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ć
@binddla elementów wejściowych;@bind:eventzmienia wyzwalające zdarzenie - Zdarzenia DOM:
@onclick,@oninput,@onkeydownz 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
- Model komponentów Blazor
- Wiązanie danych i obsługa zdarzeń
- Komunikacja komponentów i DI
- Zarządzanie stanem w Blazor