aspnet-core
Build, debug, modernize, or review ASP.NET Core applications with correct hosting, middleware, security, configuration, logging,…
Implement the Model-View-ViewModel pattern in .NET applications with proper separation of concerns, data binding, commands, and testable ViewModels using MVVM Toolkit. USE FOR: implementing UI separation with Model-View-ViewModel; using MVVM Toolkit (CommunityToolkit.Mvvm) for
Claude Code
$ npx -y skills add managedcode/dotnet-skills --skill mvvm --agent claude-code
Codex
$ npx skills add managedcode/dotnet-skills --skill mvvm -a codex -y
Cursor
$ npx skills add managedcode/dotnet-skills --skill mvvm -a cursor -y
Gemini CLI
$ npx skills add managedcode/dotnet-skills --skill mvvm -a gemini-cli -y
GitHub Copilot
$ npx skills add managedcode/dotnet-skills --skill mvvm -a github-copilot -y
OpenCode
$ npx skills add managedcode/dotnet-skills --skill mvvm -a opencode -y
Windsurf
$ npx skills add managedcode/dotnet-skills --skill mvvm -a windsurf -y
name: mvvm description: "Implement the Model-View-ViewModel pattern in .NET applications with proper separation of concerns, data binding, commands, and testable ViewModels using MVVM Toolkit. USE FOR: implementing UI separation with Model-View-ViewModel; using MVVM Toolkit (CommunityToolkit.Mvvm) for ViewModels; designing testable UI architecture. DO NOT USE FOR: unrelated stacks; generic tasks that do not need this specific guidance. INVOKES: inspect the repository context, edit targeted files, and run relevant build, test, lint, or validation commands when changes are made." compatibility: "Applies to WPF, MAUI, WinUI, Uno Platform, Avalonia, and Blazor projects."
See detailed examples in the `references/` folder:
| Component | Responsibility | Example | |-----------|---------------|---------| | **Model** | Business logic and data | `Product`, `Order`, `User` | | **View** | UI presentation (XAML/Razor) | `ProductPage.xaml` | | **ViewModel** | UI logic and state | `ProductViewModel` |
1. **Keep Views dumb** — no business logic in code-behind 2. **Use data binding** — connect View to ViewModel properties 3. **Commands for actions** — handle user interactions via ICommand 4. **Inject dependencies** — services go into ViewModel constructors 5. **Test ViewModels** — they should be unit testable without UI
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.*" />
public partial class ProductViewModel(IProductService productService) : ObservableObject
{
[ObservableProperty]
private string _name = string.Empty;
[ObservableProperty]
private decimal _price;
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(SaveCommand))]
private bool _isValid;
[RelayCommand(CanExecute = nameof(CanSave))]
private async Task SaveAsync()
{
await productService.SaveAsync(new Product { Name = Name, Price = Price });
}
private bool CanSave() => IsValid && !string.IsNullOrEmpty(Name);
}public partial class OrderViewModel : ObservableObject
{
[ObservableProperty]
private int _quantity;
[ObservableProperty]
private decimal _unitPrice;
// Computed property - manually notify
public decimal Total => Quantity * UnitPrice;
partial void OnQuantityChanged(int value)
{
OnPropertyChanged(nameof(Total));
}
partial void OnUnitPriceChanged(decimal value)
{
OnPropertyChanged(nameof(Total));
}
}public partial class ProductListViewModel(IProductService productService) : ObservableObject
{
[ObservableProperty]
private ObservableCollection<ProductViewModel> _products = [];
[ObservableProperty]
private ProductViewModel? _selectedProduct;
[ObservableProperty]
private bool _isLoading;
[RelayCommand]
private async Task LoadProductsAsync()
{
IsLoading = true;
try
{
var items = await productService.GetAllAsync();
Products = new ObservableCollection<ProductViewModel>(
items.Select(p => new ProductViewModel(productService)
{
Name = p.Name,
Price = p.Price
}));
}
finally
{
IsLoading = false;
}
}
[RelayCommand]
private void DeleteProduct(ProductViewModel product)
{
Products.Remove(product);
}
}public partial class SearchViewModel : ObservableObject
{
[ObservableProperty]
private string _searchText = string.Empty;
[RelayCommand(IncludeCancelCommand = true)]
private async Task SearchAsync(CancellationToken token)
{
await Task.Delay(500, token); // Debounce
// Search logic with cancellation support
}
}public partial class NavigationViewModel : ObservableObject
{
[RelayCommand]
private void NavigateTo(string page)
{
// Navigate to page
}
[RelayCommand]
private async Task OpenItemAsync(int itemId)
{
// Load and open item
}
}// Define message public record ProductSelectedMessage(Product Product); // Send from one ViewModel WeakReferenceMessenger.Default.Send(new ProductSelectedMessage(selectedProduct));
public partial class ProductDetailViewModel : ObservableRecipient
{
public ProductDetailViewModel()
{
IsActive = true; // Enable message reception
}
protected override void OnActivated()
{
Messenger.Register<ProductDetailViewModel, ProductSelectedMessage>(
this, (r, m) => r.LoadProduct(m.Product));
}
private void LoadPStop explaining .NET to your AI. Start building. We've all been there: asking Claude to use Entity Framework, only to get EF6 patterns in a .NET 8 project. Explaining to Copilot that Blazor Server and Blazor WebAssembly aren't the same thing.
Build, debug, modernize, or review ASP.NET Core applications with correct hosting, middleware, security, configuration, logging,…
Build, upgrade, and operate Aspire 13.5.x C# or TypeScript application hosts with the current CLI, AppHost, ServiceDefaults,…
Build and debug Avalonia 11/12 .NET applications with XAML, compiled bindings, MVVM, custom controls, desktop lifetimes, and…
Build, review, or migrate Azure Functions in .NET with correct execution model, isolated worker setup, bindings, DI, and Durable…
Build and review Blazor applications across server, WebAssembly, web app, and hybrid scenarios with correct component design,…
Maintain or migrate EF6-based applications with realistic guidance on what to keep, what to modernize, and when EF Core is or is…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.