100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
.NET

Caliburn.Micro Overview

An overview of Caliburn.Micro, the convention-based MVVM framework that automates view-viewmodel binding, actions, and screen conductors with minimal explicit wiring.

MVVM FrameworksIntermediate9 min readJul 10, 2026
Analogies

Convention Over Configuration

Caliburn.Micro is a small, opinionated MVVM framework whose defining feature is naming-convention-based wiring: if a view named ShellView.xaml exists, the framework's ViewModelLocator will automatically bind it to a view model named ShellViewModel by stripping the 'View' suffix and appending 'ViewModel', with no explicit DataTemplate or manual instantiation required, as long as both follow the Views/ and ViewModels/ (or Views./ViewModels.) namespace convention. This same convention engine also auto-binds named controls: a Button named x:Name="Save" in XAML automatically calls a Save() method on the view model, and its enabled state automatically binds to a CanSave property or CanSave() method if one exists, all without a single Command or Binding attribute written by hand.

🏏

Cricket analogy: Like a franchise's fixed batting order convention, opener, one-drop, middle order, that lets a new player slot in without a fresh meeting each match, Caliburn.Micro's ViewModelLocator slots a ShellView into ShellViewModel automatically because both simply follow the naming convention.

Action Message Binding

Beyond naming conventions, Caliburn.Micro's ActionMessage system (invoked via cal:Message.Attach="[Event Click] = [Action Save]" in older XAML syntax, or simply relying on the default convention that maps a control's default event to a same-named method) lets you invoke arbitrary view-model methods directly from XAML events without writing any ICommand implementation at all; if the target method accepts parameters, Caliburn.Micro can pass $eventArgs, $dataContext, or values from named elements automatically via its special-value resolution. Guard methods (a CanX method or bool CanX property matching an X action method) automatically control the target control's IsEnabled state, mirroring how RelayCommand's CanExecute works but without any ICommand object in sight.

🏏

Cricket analogy: Like a pre-agreed team signal where a specific hand gesture from the captain always means 'change the field to a slip cordon', no radio call needed, ActionMessage lets a XAML event directly trigger a view-model method with no ICommand object mediating.

csharp
// ShellViewModel.cs
public class ShellViewModel : Conductor<object>
{
    private string title;
    public string Title
    {
        get => title;
        set { title = value; NotifyOfPropertyChange(() => Title); }
    }

    public void Save()
    {
        // Invoked automatically when a button named x:Name="Save" is clicked.
    }

    public bool CanSave => !string.IsNullOrWhiteSpace(Title);
}

// ShellView.xaml
// <Button x:Name="Save" Content="Save" />
// IsEnabled is bound automatically to CanSave

Screens and Conductors

Caliburn.Micro's Screen base class implements IScreen, adding lifecycle hooks OnActivate, OnDeactivate, and CanClose(Action<bool> callback) on top of PropertyChangedBase's INotifyPropertyChanged support. A Conductor<T> manages one or more Screen instances as an active item or a collection (via Conductor<T>.Collection.OneActive), automatically calling deactivate on the outgoing screen and activate on the incoming one, which is the mechanism behind tab controls, wizard flows, and single-active-document shells without any manual bookkeeping of which child is currently shown.

🏏

Cricket analogy: Like a team's twelfth-man substitution protocol automatically benching the outgoing fielder and activating the substitute without the captain manually resetting the scorecard, a Conductor automatically deactivates the outgoing screen and activates the incoming one.

Caliburn.Micro's IoC.GetInstance and the ViewModelLocator can be paired with any DI container (SimpleContainer ships built in, but Ninject, Autofac, or Unity can be substituted), so the convention-based wiring for views and the flexibility of a full DI container are not mutually exclusive.

  • Caliburn.Micro auto-resolves views to view models by stripping 'View' and appending 'ViewModel' to the type name, following the Views/ViewModels namespace convention.
  • Named XAML controls auto-bind to same-named view-model methods and properties without explicit Command or Binding syntax.
  • CanX guard methods or properties automatically control a paired X action's enabled state.
  • Screen and Conductor<T> provide lifecycle management (OnActivate, OnDeactivate, CanClose) for composable, navigable UI regions.
  • Conductor<T>.Collection.OneActive is the standard base for tab-like or wizard-like single-active-child UIs.
  • PropertyChangedBase provides NotifyOfPropertyChange as Caliburn.Micro's equivalent of CommunityToolkit.Mvvm's SetProperty.
  • Caliburn.Micro ships a lightweight built-in IoC container but can be swapped for Ninject, Autofac, or Unity.

Practice what you learned

Was this page helpful?

Topics covered

#NET#MVVMDesignPatternStudyNotes#MicrosoftTechnologies#CaliburnMicroOverview#Caliburn#Micro#Convention#Over#StudyNotes#SkillVeris