Table of Contents

Create Your First App

dotnet new CT -o CounterApp
cd CounterApp

ViewModel

public partial class CounterViewModel : ObservableObject
{
    [ObservableProperty] private int _count;
    public void Increment() => Count++;
    public void Decrement() => Count--;
    public void Reset() => Count = 0;
}

View

<UserControl ViewModelLocator.AutoWireViewModel="True">
    <StackPanel HorizontalAlignment="Center" Spacing="10">
        <TextBlock Text="{Binding Count}" FontSize="48"/>
        <StackPanel Orientation="Horizontal" Spacing="10">
            <Button Content="-" Command="{Binding Decrement}"/>
            <Button Content="Reset" Command="{Binding Reset}"/>
            <Button Content="+" Command="{Binding Increment}"/>
        </StackPanel>
    </StackPanel>
</UserControl>

Register

services.AddMvvmTransient<CounterView, CounterViewModel>();
// MainWindow: CreateShell<MainWindow, MainView>() in CreateShell
dotnet run

Further Reading

How it works: Architecture — Bootstrap Pipeline & MVVM Wiring — startup sequence, ViewModelLocator auto-binding, and why only ViewModel enters DI.