Let's walk through two mini projects side-by-side in C# — one using MVC for a web app (ASP.NET Core), and another using MVVM for a desktop app (WPF). Both will manage a simple Product
with properties like Name
and Price
.
🔷 PROJECT 1: ASP.NET Core MVC Web App
✅ Goal:
A web interface to view and create products using the MVC pattern.
🔧 Tech Stack:
- ASP.NET Core MVC (.NET 8+)
- Razor Views
📁 Folder Structure:
MvcProductApp/ │ ├── Controllers/ │ └── ProductController.cs ├── Models/ │ └── Product.cs ├── Views/ │ └── Product/ │ ├── Index.cshtml │ └── Create.cshtml ├── Startup.cs or Program.cs (depending on template)
📄 Models/Product.cs
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } }
📄 Controllers/ProductController.cs
public class ProductController : Controller { private static List<Product> products = new(); public IActionResult Index() { return View(products); } [HttpGet] public IActionResult Create() { return View(); } [HttpPost] public IActionResult Create(Product product) { products.Add(product); return RedirectToAction("Index"); } }
📄 Views/Product/Index.cshtml
@model List<Product> <h2>Product List</h2> <a href="/Product/Create">Create Product</a> <ul> @foreach (var product in Model) { <li>@product.Name - $@product.Price</li> } </ul>
📄 Views/Product/Create.cshtml
@model Product <h2>Create Product</h2> <form asp-action="Create" method="post"> <input asp-for="Name" placeholder="Name" /> <input asp-for="Price" placeholder="Price" /> <button type="submit">Save</button> </form>
✅ Run this in your browser. It uses classic MVC:
- Controller mediates between View and Model.
- No live data-binding or client-side state.
🔷 PROJECT 2: WPF MVVM Desktop App
✅ Goal:
A WPF desktop app where you can bind textboxes to a ProductViewModel
using MVVM.
🔧 Tech Stack:
- WPF App (.NET 8+)
- MVVM with
INotifyPropertyChanged
andICommand
📁 Folder Structure:
MvvmProductApp/ │ ├── Models/ │ └── Product.cs ├── ViewModels/ │ └── ProductViewModel.cs ├── Views/ │ └── MainWindow.xaml ├── RelayCommand.cs └── App.xaml.cs / MainWindow.xaml.cs
📄 Models/Product.cs
public class Product { public string Name { get; set; } public decimal Price { get; set; } }
📄 RelayCommand.cs
public class RelayCommand : ICommand { private readonly Action _execute; public RelayCommand(Action execute) => _execute = execute; public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) => true; public void Execute(object parameter) => _execute(); }
📄 ViewModels/ProductViewModel.cs
public class ProductViewModel : INotifyPropertyChanged { private string _name; private decimal _price; public string Name { get => _name; set { _name = value; OnPropertyChanged(nameof(Name)); } } public decimal Price { get => _price; set { _price = value; OnPropertyChanged(nameof(Price)); } } public ICommand SaveCommand { get; } public ProductViewModel() { SaveCommand = new RelayCommand(SaveProduct); } private void SaveProduct() { MessageBox.Show($"Product saved: {Name}, ${Price}"); } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
📄 Views/MainWindow.xaml
<Window x:Class="MvvmProductApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:MvvmProductApp" Title="MVVM Product App" Height="200" Width="300"> <Window.DataContext> <local:ProductViewModel /> </Window.DataContext> <StackPanel Margin="20"> <TextBox Text="{Binding Name, Mode=TwoWay}" PlaceholderText="Product Name" /> <TextBox Text="{Binding Price, Mode=TwoWay}" PlaceholderText="Price" /> <Button Content="Save" Command="{Binding SaveCommand}" /> </StackPanel> </Window>
✅ This is classic MVVM:
- ViewModel handles logic and exposes data.
- View binds to ViewModel (no event handlers in code-behind).
- Supports real-time UI updates and data validation.
🧠 Final Thoughts
Feature | ASP.NET MVC | WPF MVVM |
---|---|---|
UI Update Method | Server-driven (postbacks) | Data binding (live updates) |
Logic Separation | Controller-centric | ViewModel-centric |
Platform | Web | Desktop/mobile |
Testability | Controller unit test | ViewModel unit test |
Top comments (0)