Xamarin Blazor Mobile Button Event Handlers

WORKING WITH FORMS IN XAMARIN / BLAZOR MOBILE APPS

by

Using the Blazor programming model to handle button events, like OnClick, makes writing Xamarin mobile applications with form inputs a breeze.

Getting Started

In the previous tutorial, you learned how to create some of the more common mobile app layout designs. In this tutorial, we will bind the values of some Entry components and do something with them when a button is clicked.

If you are used to web development, the Entry component is basically the mobile equivalent of an input field, or an InputText component in traditional Blazor web applications.

Designing the Form

For demonstrations purposes, the form itself will be quite simple. In fact, we will create a mobile equivalent of a C# console application used in the C# for Beginners tutorial series. It will ask for a user's first name, last name, and the year of their birth. Finally, it will perform some simple calculations and return some results to display in the the mobile app user interface.

For the form itself, I will use a simple StackLayout with Label and Entry components to collect the user's input.

<StackLayout Margin="new Thickness(16)">
	<Label Text="Enter your first name?"
		   FontSize="16" />
	<Entry @bind-Text="firstName" />

	<Label Text="Enter your last name?"
		   FontSize="16" />
	<Entry @bind-Text="lastName" />

	<Label Text="What year were you born?"
		   FontSize="16" />
	<Entry @bind-Text="birthYearString" />

	<Button OnClick="ButtonClickHandler" Text="Submit" />
</StackLayout>
 
@code {
    string firstName;
    string lastName;
    string birthYearString;
    private void ButtonClickHandler()
    {
        
    }
}

A note about the Xamarin Entry component is that it binds to a string. In order to bind to an int, you can use a ValueConverter. In this example, I will just perform the conversion myself in the ButtonClickHandler() method, and I will display an error message if a non-integer value is entered.

string errorMessage;

private void ButtonClickHandler()
{
	if (int.TryParse(birthYearString, out int birthYear))
	{
		errorMessage = null;
		//Do something with birthYear int
	}
	else
	{
		errorMessage = "Please enter a valid year.";
	}
}

So far, my button's OnClick handler will try to parse the string entered into the birthYearString Entry field into an integer value. If it succeeds, we can do something with the result. If it fails, we can display an error message for the user. Let's show the error message on the screen above the Submit button.

@if (errorMessage != null)
{
    <Label Text="@errorMessage" TextColor="Color.Red"
           FontSize="14" />
}
 
<Button OnClick="ButtonClickHandler" Text="Submit" />

Displaying the Results

To hold the results, I will create a model that contains the three strings we want to display to the user. Create a new class file called ResultModel.cs.

public class ResultModel
{
    public string WelcomeText { get; set; }
    public string CurrentAgeText { get; set; }
    public string PlusFiveAgeText { get; set; }
}

Then, in your button's OnClick handler, you can perform any necessary calculations and store the results in a ResultsModel object.

ResultModel result;
 
private void ButtonClickHandler()
{
    if (int.TryParse(birthYearString, out int birthYear))
    {
        errorMessage = null;
        int currentAge = DateTime.Now.Year - birthYear;
        result = new ResultModel()
        {
            WelcomeText = $"Hello, {firstName} {lastName}.",
            CurrentAgeText = $"This year, you will be {currentAge} years old.",
            PlusFiveAgeText = $"In 5 years, you will have {currentAge + 5} years."
        };
    }
    else
    {
        result = null;
        errorMessage = "Please enter a valid year.";
    }
}

Finally, display the results to the user. You could pass the ResultModel object as a parameter to a separate Razor component, or just display it inline on the same page.

if (result != null)
{
    <Label Text="@result.WelcomeText"
           FontSize="16" TextColor="Color.DarkBlue" />
    <Label Text="@result.CurrentAgeText"
           FontSize="16" TextColor="Color.DarkBlue" />
    <Label Text="@result.PlusFiveAgeText"
           FontSize="16" TextColor="Color.DarkBlue" />
}

Your final Xamarin/Blazor mobile application page code may look like the following.

@using MobileBlazorApp.Models
<ContentPage>
    <StackLayout Margin="new Thickness(16)">
        <Label Text="Enter your first name?"
               FontSize="16" />
        <Entry @bind-Text="firstName" />
 
        <Label Text="Enter your last name?"
               FontSize="16" />
        <Entry @bind-Text="lastName" />
 
        <Label Text="What year were you born?"
               FontSize="16" />
        <Entry @bind-Text="birthYearString" />
        @if (errorMessage != null)
        {
            <Label Text="@errorMessage" TextColor="Color.Red"
                   FontSize="14" />
        }
        else
        {
            if (result != null)
            {
                <Label Text="@result.WelcomeText"
                       FontSize="16" TextColor="Color.DarkBlue" />
                <Label Text="@result.CurrentAgeText"
                       FontSize="16" TextColor="Color.DarkBlue" />
                <Label Text="@result.PlusFiveAgeText"
                       FontSize="16" TextColor="Color.DarkBlue" />
            }
        }
 
        <Button OnClick="ButtonClickHandler" Text="Submit" />
    </StackLayout>
</ContentPage>
 
@code {
    string firstName;
    string lastName;
    string birthYearString;
    string errorMessage;
 
    ResultModel result;
 
    private void ButtonClickHandler()
    {
        if (int.TryParse(birthYearString, out int birthYear))
        {
            errorMessage = null;
            int currentAge = DateTime.Now.Year - birthYear;
            result = new ResultModel()
            {
                WelcomeText = $"Hello, {firstName} {lastName}.",
                CurrentAgeText = $"This year, you will be {currentAge} years old.",
                PlusFiveAgeText = $"In 5 years, you will have {currentAge + 5} years."
            };
        }
        else
        {
            result = null;
            errorMessage = "Please enter a valid year.";
        }
    }
}

The Bottom Line

In this tutorial, you learned how to accept user input in your Xamarin mobile applications using the Blazor programming model by creating a form and binding Entry field values to string variables in your application. You also learned one technique for extending that functionality to allow for working with integers. Finally, you learned how to save your results to an instance of a model class which allows you to easily pass data to another component or to display results to your application's user interface.


Don't stop learning!

There is so much to discover about C#. That's why I am making my favorite tips and tricks available for free. Enter your email address below to become a better .NET developer.


Did you know?

Our beautiful, multi-column C# reference guides contain more than 150 tips and examples to make it even easier to write better code.

Get your cheat sheets