DEV Community

Dimension AI Technologies
Dimension AI Technologies

Posted on

MVC vs MVVM: what's the difference? (C# example)

MVC vs MVVM: Understanding Flow vs Roles

Many developers find MVC intuitive but MVVM opaque, yet also hear that MVVM is superior to MVC.

A key reason for this dissonance is that the acronyms MVC and MVVM list roles, not the runtime order (or pipeline) of input and updates.

An Alternative Mental Model: ICMV and IVVMM

MVC (roles vs flow)

  • Roles (name): Model – View – Controller
  • Actual flow: Input → Controller → Model → View
  • Instead of MVC, think of this as ICMV for the order of flow

MVVM (roles vs flow)

  • Roles (name): Model – View – ViewModel
  • Actual flow: Input → View ↔ ViewModel ↔ Model
  • The ↔ flows are managed automatically with "data binding"
  • Instead of MVVM, think of this as IVVMM

To resolve the mismatch between the names MVC/MVVM and the order data flows, thinking of them instead as ICMV and IVVMM can help dramatically.

Minimal MVC Example

Controller updates the model, then pushes data to the view.

// Model
public class Person { public string Name { get; set; } }

// View
public class PersonView
{
    public void Show(string name) => Console.WriteLine($"Name: {name}");
}

// Controller
public class PersonController
{
    private readonly Person _model;
    private readonly PersonView _view;

    public PersonController(Person model, PersonView view)
    {
        _model = model;
        _view = view;
    }

    public void SetName(string name) => _model.Name = name;
    public void UpdateView() => _view.Show(_model.Name);
}

// Usage
class Program
{
    static void Main()
    {
        var model = new Person();
        var view = new PersonView();
        var controller = new PersonController(model, view);

        controller.SetName("Alice");
        controller.UpdateView();  // Output: Name: Alice
    }
}
Enter fullscreen mode Exit fullscreen mode

Notice: The controller orchestrates; the view is passive.

Minimal MVVM Example (using Microsoft WPF)

The View binds to properties on the ViewModel; changes propagate via INotifyPropertyChanged.

ViewModel + Model (C#)

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class Person { public string Name { get; set; } = ""; }

public class PersonViewModel : INotifyPropertyChanged
{
    private readonly Person _model;
    private string _name;

    public PersonViewModel(Person model)
    {
        _model = model;
        _name = model.Name;
    }

    public string Name
    {
        get => _name;
        set
        {
            if (_name == value) return;
            _name = value;
            _model.Name = value;      // keep model in sync
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string p = null)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(p));
}
Enter fullscreen mode Exit fullscreen mode

View (XAML)

<Window x:Class="Demo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MVVM Demo" Height="120" Width="280">
  <StackPanel Margin="12">
    <TextBlock Text="Name:" Margin="0,0,0,6"/>
    <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
    <TextBlock Text="{Binding Name}" Margin="0,8,0,0"/>
  </StackPanel>
</Window>
Enter fullscreen mode Exit fullscreen mode

Window Code-Behind (DataContext setup)

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new PersonViewModel(new Person { Name = "Alice" });
    }
}
Enter fullscreen mode Exit fullscreen mode

Notice: The view binds to Name. Typing updates the ViewModel (and model). When the ViewModel raises PropertyChanged, the UI refreshes automatically. No explicit controller call.

Key Takeaways

  • MVC: Controller drives the sequence; View updates last
  • MVVM: Binding keeps View and ViewModel in sync; changes flow both ways

The acronyms describe parts, not order. Thinking of them as ICMV vs IVVMM clarifies the execution flow.

Why MVVM?

Key Benefits Over MVC

1. Independent Testing of Logic

In MVC, logic often ends up in the controller and tied to the view's lifecycle. In MVVM, the ViewModel consists of standard classes implementing properties and commands, enabling unit testing without UI framework dependencies.

2. Cleaner Separation of Concerns

  • MVC: Controller decides what to render, often with direct view calls, tangling UI and control flow
  • MVVM: View handles visuals only; ViewModel exposes data and actions; Model contains pure data

3. Declarative Data Binding

Changes in the ViewModel automatically update the View, and vice versa. This reduces manual "push this value into the textbox" or "read this textbox back into the model" operations.

4. Reusability of ViewModels (for multi-platform scenarios)

You can bind the same ViewModel to different views (desktop app, mobile app, test harness). In MVC, controllers are harder to reuse due to tight coupling with their views. This advantage only applies when you're actually building for multiple platforms.

5. Reduced Boilerplate for State Sync

In MVC, you constantly write code to sync model ↔ view. In MVVM, binding handles this automatically, reducing glue code clutter.

Trade-offs

Disadvantages

  • Steeper learning curve: The binding system can feel "invisible" compared to explicit controller code
  • Debugging complexity: Bugs in bindings or PropertyChanged events are harder to trace

For these reasons, MVVM can be excessive for small projects. For simple applications, MVC may be more straightforward.

Summary

  • MVC: Effective for server-side applications and scenarios requiring explicit control flow, but can create tight coupling and testing challenges
  • MVVM: Valuable for data-driven desktop/mobile UIs with robust binding frameworks, but adds complexity and potential performance overhead
  • Context matters: Choose based on your platform, team expertise, application complexity, and performance requirements rather than following blanket recommendations

Note: Modern frameworks often implement hybrid approaches that combine elements of multiple patterns. The examples shown here represent traditional implementations primarily in .NET/C# contexts.

Top comments (0)