PostSharp MVVM

Remove boilerplate from your WPF and WinForms apps.

  • Remove repetitive code from INotifyPropertyChanged, Commands, Dependency Properties and Undo/Redo.
  • Easy validation with Code Contracts.
  • Keep your View-Model code super clean.
  • Works with most MVVM frameworks: Caliburn.Micro and MVVM Light.
  • Highly customizable.

PostSharp Essentials


10 enhanced classes per project.

PostSharp MVVM

$195 per developer

No limitation whatsoever.


Get rid of 95% of the INotifyPropertyChanged boilerplate and never miss a notification again.

  • Support for composite properties and child objects
  • Consistent and reliable
  • Fully customizable
  • Integrates with other MVVM frameworks: MVVM Light and Caliburn.Micro

public class CustomerViewModel
    public CustomerModel Customer { get; set; }
    public string FullName
            // Change in Customer, Customer.FirstName or 
            // Customer.PrincipalAddress.Line1 will trigger the event. 
            return string.Format("{0} {1} from {2}",
                Customer?.PrincipalAddress?.FullAddress );


Stop creating a class every time you define a command.

  • Easy, based on custom attributes and naming conventions.
  • Validated at build time.
  • CanExecute property integrates with the [NotifyPropertyChanged] aspect.

public partial class MainWindow : Window
    bool isReadOnly;

    public ICommand SaveCommand { get; private set; }
    private void ExecuteSave()
        // Details skipped.
    public bool CanExecuteSave => !this.isReadOnly;

Dependency & Attached Properties

Dependency properties that still look like properties.

  • Support for composite properties and child objects.
  • Consistent and reliable.
  • Fully customizable.
  • Integrates with PostSharp code contracts.
  • Integrates with other MVVM frameworks.

public partial class FancyTextBlock : UserControl
    public FancyTextBlock()
    public string Text { get; set; } = "Hello, world.";

    public Brush FancyBorderBrush { get; set; }

    public void OnFancyBorderBrushChanged() { /* Handle changes here. */ }

Code Contracts

The most readable way to validate values at run-time.

  • Works with parameters, output parameters, return values, fields, and properties.
  • Works on interfaces and abstract methods. Automatically inherited.
  • As fast as hand-written code.
  • Customizable and localizable exception messages.
  • Integrates with the [DependencyProperty] aspect.

public interface IReferralService
    [return: Required]
    Referral CreateReferral( [Required] string name, [Url] string url );
public class ReferralService : IReferralService
    public Referral CreateReferral( string name, string url )
        // Contracts are automatically inherited from the interface.
    public string ConnectionString { get; set; }


Weak Event

Avoid the most common source of memory leaks in .NET.

  • As simple as a custom attribute.
  • Apply to all events in your project in a single line.

static class MyEventSource
   public static event EventHandler MyEvent;

class MyEventClient
  public MyEventClient()
     MyEventSource.MyEvent += ( sender, e ) => Console.WriteLine( "Oops!" );

     // No need for IDisposable and handler unregistration.



Give your users the familiar Undo/Redo experience without breaking the bank.

  • Undo/Redo any object state change.
  • Handle multiple changes as one step.
  • Expose in the UI with built-in or custom controls.

Break free from routine TODAY and start delivering more in less time.