Chapter 5: Data Binding and MVVM Pattern in .NET MAUI

In this chapter, we dive deep into Data Binding and the Model-View-ViewModel (MVVM) design pattern. These two are fundamental concepts that promote separation of concerns, making your applications more maintainable, scalable, and testable.

1. Introduction to Data Binding

Data binding in .NET MAUI allows properties of two objects to be synchronized. Typically, you bind UI elements to properties in your ViewModel. Binding supports different modes like OneWay, TwoWay, and OneTime.

<Label Text="{Binding Username}" FontSize="20" />

The above XAML binds the Label's text to the Username property in the ViewModel.

2. Implementing MVVM (Model-View-ViewModel)

The MVVM pattern separates your app into three components:

  • Model: Handles data and business logic.
  • View: The UI layer written in XAML.
  • ViewModel: Acts as a bridge between Model and View.

Here’s a basic ViewModel implementation:

public class UserViewModel : INotifyPropertyChanged
{
    private string username;
    public string Username
    {
        get => username;
        set
        {
            if (username != value)
            {
                username = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

3. Commands and Behaviors

Commands are used to handle events like button clicks declaratively from XAML. MAUI provides Command class for this purpose.

public ICommand LoginCommand { get; }

public UserViewModel()
{
    LoginCommand = new Command(OnLogin);
}

private void OnLogin()
{
    // Login logic
}

Bind it to a Button in XAML:

<Button Text="Login" Command="{Binding LoginCommand}" />

4. Dependency Injection in .NET MAUI

.NET MAUI uses Microsoft.Extensions.DependencyInjection for DI support. Register your services in MauiProgram.cs:

builder.Services.AddSingleton<UserViewModel>();
builder.Services.AddTransient<LoginPage>();

Access the ViewModel using constructor injection or through binding context.

5. Handling User Inputs Efficiently

Always use TwoWay binding mode when user input needs to update the ViewModel property.

<Entry Text="{Binding Username, Mode=TwoWay}" Placeholder="Enter username" />

This ensures that as the user types into the Entry, the Username property is updated accordingly.

Conclusion

Understanding and applying the MVVM pattern, along with powerful features like data binding and dependency injection, is essential to mastering .NET MAUI. These tools not only improve code clarity but also enable robust and maintainable applications.