MvvmToolbox 0.6.0

dotnet add package MvvmToolbox --version 0.6.0
                    
NuGet\Install-Package MvvmToolbox -Version 0.6.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MvvmToolbox" Version="0.6.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MvvmToolbox" Version="0.6.0" />
                    
Directory.Packages.props
<PackageReference Include="MvvmToolbox" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MvvmToolbox --version 0.6.0
                    
#r "nuget: MvvmToolbox, 0.6.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MvvmToolbox@0.6.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MvvmToolbox&version=0.6.0
                    
Install as a Cake Addin
#tool nuget:?package=MvvmToolbox&version=0.6.0
                    
Install as a Cake Tool

MvvmToolkit

Code generator that populates a ViewModel tree with data from a model tree and updates the model tree when changes are made to the ViewModel tree.

Features

  • Roslyn Code Generator
  • Mapping between Model and ViewModel trees
  • Custom converters
  • AOT-compatible
  • Trimmable
  • CommunityToolkit.Mvvm compatible.
  • WPF, WinUI, and Avalonia compatible.

Installation

Nuget package

dotnet add package MvvmToolbox

Examples

Simple Types

Synchronizing properties with simple data types between the Model and the ViewModel.

Model
namespace Demo.Models;

public class DemoModel
{
    public string Name { get; set; } = "Peter";
}
ViewModel
using CommunityToolkit.Mvvm.ComponentModel;
using MvvmToolbox.ComponentModel;
using ObservableModelGeneratorUnitTests.Models;

namespace Demo.ViewModels;

[ObservableModelObject(typeof(DemoModel))]
public partial class DemoViewModel : ObservableObject
{
    [ObservableProperty]
    [ObservableModelProperty]
    public partial string Name { get; set; }
}

List of Simple Types

Synchronizing properties with a list of simple data types between the Model and the ViewModel.

Model
namespace Demo.Models;

public class DemoModel
{
    public List<string> Names { get; set; } = [ "Peter", "Paul", "Mary"];
}
ViewModel
using CommunityToolkit.Mvvm.ComponentModel;
using MvvmToolbox.ComponentModel;
using ObservableModelGeneratorUnitTests.Models;

namespace Demo.ViewModels;

[ObservableModelObject(typeof(DemoModel))]
public partial class DemoViewModel : ObservableObject
{
    // no partial, no set, no nullable, and no [ObservableProperty]
    [ObservableModelProperty]
    public ObservableCollection<string> Names { get; }
}

Different Names

Synchronizing properties with different names between Model and ViewModel.

Model
namespace Demo.Models;

public class DemoModel
{
    public string Name { get; set; } = "Peter";
}
ViewModel
using CommunityToolkit.Mvvm.ComponentModel;
using MvvmToolbox.ComponentModel;
using ObservableModelGeneratorUnitTests.Models;

namespace Demo.ViewModels;

[ObservableModelObject(typeof(DemoModel))]
public partial class DemoViewModel : ObservableObject
{
    [ObservableProperty]
    [ObservableModelProperty(nameof(DemoModel.Name))]
    public partial string FirstName { get; set; }
}

Children

Synchronizing properties with children between Model and ViewModel.

Model
namespace Demo.Models;

public class RootModel
{
    public LeafModel? Leaf { get; set; } = new LeafModel();
}

public class LeafModel
{
    public string Name { get; set; } = "Peter";
}
ViewModel
using CommunityToolkit.Mvvm.ComponentModel;
using MvvmToolbox.ComponentModel;
using ObservableModelGeneratorUnitTests.Models;

namespace Demo.ViewModels;

[ObservableModelObject(typeof(RootModel))]
public partial class RootViewModel : ObservableObject
{
    [ObservableProperty]
    [ObservableModelProperty]
    public partial LeafViewModel? Leaf { get; set; }
}

[ObservableModelObject(typeof(LeafModel))]
public partial class LeafViewModel : ObservableObject
{
    [ObservableProperty]
    [ObservableModelProperty]
    public partial string Name { get; set; }
}

List of Children

Synchronizing properties with a list of children between Model and ViewModel.

Model
namespace Demo.Models;

public class RootModel
{
    public List<LeafModel> Leafs { get; set; } = [new LeafModel(), new LeafModel()];
}

public class LeafModel
{
    public string Name { get; set; } = "Peter";
}
ViewModel
using CommunityToolkit.Mvvm.ComponentModel;
using MvvmToolbox.ComponentModel;
using ObservableModelGeneratorUnitTests.Models;

namespace Demo.ViewModels;

[ObservableModelObject(typeof(RootModel))]
public partial class RootViewModel : ObservableObject
{
    // no partial, no set, no nullable, and no [ObservableProperty]
    [ObservableModelProperty]
    public ObservableCollection<LeafViewModel> Leafs { get; }
}

[ObservableModelObject(typeof(LeafModel))]
public partial class LeafViewModel : ObservableObject
{
    [ObservableProperty]
    [ObservableModelProperty]
    public partial string Name { get; set; }
}

Converter Functions

Synchronizing properties with converters between the Model and the ViewModel. The converters can also be applied to lists and "list to simpleType" mappings.

Model
namespace Demo.Models;

public class DemoModel
{
    public int Num { get; set; } = 25;
}
ViewModel
using CommunityToolkit.Mvvm.ComponentModel;
using MvvmToolbox.ComponentModel;
using ObservableModelGeneratorUnitTests.Models;

namespace Demo.ViewModels;

[ObservableModelObject(typeof(DemoModel))]
public partial class DemoViewModel : ObservableObject
{
    [ObservableProperty]
    [ObservableModelProperty(Converter = "NumConvert")]
    public partial string Num { get; set; }

    private string GetNumConvert(int val) => val.ToString();
    private int SetNumConvert(string val) => int.Parse(val);
}

Converter Interface

Synchronizing properties with converters between the Model and the ViewModel. The converters can also be applied to lists and "list to simpleType" mappings.

Model
namespace Demo.Models;

public class DemoModel
{
    public int Num { get; set; } = 25;
}
ViewModel
using CommunityToolkit.Mvvm.ComponentModel;
using MvvmToolbox.ComponentModel;
using ObservableModelGeneratorUnitTests.Models;

namespace Demo.ViewModels;

[ObservableModelObject(typeof(DemoModel))]
public partial class DemoViewModel : ObservableObject
{
    [ObservableProperty]
    [ObservableModelProperty(ConverterType = typeof(IntToStringConverter))]
    public partial string Num { get; set; }

    private string GetNumConvert(int val) => val.ToString();
    private int SetNumConvert(string val) => int.Parse(val);

    public class IntToStringConverter : IPropertyConverter
    {
        public object Convert(object value) => value?.ToString()!;
        public object ConvertBack(object value) => (value is string input && int.TryParse(input, out int result)) ? result : null!;
    }
}
There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.6.0 83 10/12/2026
0.5.0 87 10/6/2026
0.4.0 90 10/5/2026
0.3.0 84 10/5/2026
0.2.0 91 10/4/2026

Initialize added