Table of Contents

Introduction (3.1.1)

Crystal.Avalonia is a lightweight infrastructure layer for Avalonia applications:

  • Modules — IModule for feature registration
  • DI — Microsoft.Extensions.DependencyInjection
  • View/ViewModel wiring — View-first & ViewModel-first
  • AOT — Trimming-friendly

Not an MVVM Framework

No ViewModel base classes, commands, or bindings — use CommunityToolkit.Mvvm, Prism, ReactiveUI, etc.

Binding Modes

View-first — XAML sets ViewModelLocator.AutoWireViewModel="True", ViewModel resolved from DI:

<UserControl ViewModelLocator.AutoWireViewModel="True">
    <TextBlock Text="{Binding Greeting}"/>
</UserControl>

ViewModel-first — bind ViewModel to ContentControl, ViewLocator creates View:

<ContentControl Content="{Binding MainViewModel}"/>

Registration

public override void ConfigureOptions(CrystalOptions options)
{
    options.EnableViewLocator = true; // default; also available via DI
}

services.AddMvvmTransient<MainView, MainViewModel>(); // ViewModel → DI, View → mapping only
// Shell: CreateShell<MainWindow, MainView>() — not from DI
Component Role
CrystalApplication App base with module/DI bootstrap
CrystalApplication.Options Per-app CrystalOptions (DI singleton); set via ConfigureOptions
CrystalApplication.Mvvm Per-app View↔VM mappings and ServiceProvider
CreateShell<TWindow, TView>() Shell via new; ViewModel wired by ViewModelLocator
AddMvvmTransient / AddMvvmSingleton ViewModel lifetime + View mapping
ViewModelLocator View-first DataContext injection
ViewLocator ViewModel-first View creation (EnableViewLocator)
EventToCommand Event → ICommand (default Avalonia xmlns, no prefix)

Next Steps