Blazor Data Binding
Tip: Data binding is a core concept in Blazor, enabling seamless synchronization between your UI and your C# code.
Understanding Data Binding in Blazor
Data binding in Blazor is the mechanism by which UI elements and C# code variables can be linked together. When a value changes in the UI, the corresponding code variable can be updated automatically, and vice versa. This significantly reduces the amount of boilerplate code you need to write for UI updates and state management.
Types of Data Binding
Blazor supports several types of data binding, each serving a specific purpose:
One-Way Binding
One-way binding updates the UI when the code variable changes, but changes in the UI do not affect the code variable.
Syntax:
<p>Message: @MyMessage</p>
In this example, if the MyMessage
property in your C# code changes, the displayed text will update. However, if a user were to type into this paragraph (which isn't directly possible for <p>
, but illustrative), the MyMessage
variable would not change.
One-Way to Event Binding
This is a common pattern where UI events trigger updates in the code. The most frequent use case is binding input element values.
Syntax:
<input type="text" value="@MyInputValue" @onchange="HandleInputChange" />
Or, more commonly, using the shorthand:
<input type="text" @bind="MyInputValue" />
The @bind
directive simplifies this by combining value binding and event handling for common input types.
Two-Way Binding
Two-way binding synchronizes data in both directions. Changes in the UI update the code variable, and changes in the code variable update the UI. The @bind
directive is primarily used for this.
<input type="text" @bind="MyDataModel.Name" />
<p>Name entered: @MyDataModel.Name</p>
When the user types into the input field, the Name
property of MyDataModel
is updated. Conversely, if MyDataModel.Name
is changed programmatically, the input field will reflect that change.
Interactive Example
Two-Way Binding Demonstration
Enter your name:
Hello, @userName!
Current count: @counter
This example demonstrates two-way binding for the userName
variable. Typing in the input field updates the greeting in real-time. The Increment
button also shows how event handling works in conjunction with state updates.
// In your Blazor component (.razor file)
@code {
private string userName = "World";
private int counter = 0;
private void IncrementCounter()
{
counter++;
}
}
Binding Complex Data
You can bind to properties of complex objects as well:
<input type="text" @bind="userProfile.Email" />
<p>Email: @userProfile.Email</p>
@code {
public class UserProfile {
public string Email { get; set; }
}
private UserProfile userProfile = new UserProfile { Email = "example@domain.com" };
}
Event Callbacks
For more complex event handling or when passing callbacks to child components, you can use EventCallback
.
<!-- In parent component -->
<MyChildComponent OnMyCustomEvent="HandleCustomEvent" />
@code {
private void HandleCustomEvent(string message)
{
Console.WriteLine($"Received: {message}");
}
}
<!-- In child component (MyChildComponent.razor) -->
<button @onclick="TriggerEvent">Trigger Custom Event</button>
@code {
[Parameter]
public EventCallback<string> OnMyCustomEvent { get; set; }
private void TriggerEvent()
{
OnMyCustomEvent.InvokeAsync("This is a custom message!");
}
}
Data Binding Expressions
Blazor supports various data binding expressions within HTML markup:
@variableName
: Displays the value of a variable.@(expression)
: Evaluates and displays the result of an expression.@on*
directives: For handling events (e.g.,@onclick
,@onchange
).@bind*
directives: For two-way data binding (e.g.,@bind-value
,@bind-checked
).
Performance Considerations
While data binding is powerful, be mindful of performance with very large or rapidly changing data sets. Blazor's rendering model is generally efficient, but complex binding scenarios might require careful optimization. Use the Blazor Performance Profiler to identify any bottlenecks.