Introduction (3.1.1)
Crystal.Avalonia is a lightweight infrastructure layer for Avalonia applications:
- Modules —
IModulefor 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
- Release Notes
- Upgrade Guide — migrate from 3.0, 2.0.x, or v1.2
- Architecture — how it works internally
- Getting Started
- Tutorials