diff --git a/Samples/WpfMVVMSample/Readme.md b/Samples/WpfMVVMSample/Readme.md
new file mode 100644
index 0000000000..87ea6d5656
--- /dev/null
+++ b/Samples/WpfMVVMSample/Readme.md
@@ -0,0 +1,13 @@
+## WPF MVVM Sample
+This is a simple sample showing how UnitsNet can be used to create a WPF MVVM application. I have used this strategy in a few simple engineering apps and thought I would share it as a sample to see if others might offer improvements.
+
+It performs a simple calculation allowing flexibility in the units for parameters and results. Default units for each are specified in the settings drop down.
+
+A key feature enabling this sample is the [UnitToStringConverter](https://github.com/dayewah/UnitsNet/blob/master/Samples/WpfMVVMSample/WpfMVVMSample/Converters/UnitToStringConverter.cs) class
+- If a parameter is entered as a number the unit is assigned automatically
+- If a parameter is entered as a unit other than the default it is converted automatically
+- If a non-compatible unit is used a validation error is triggered
+
+The default unit for each parameter and the result can be changed from the settings pull down.
+
+The number of significant digits displayed can also be changed from settings.
\ No newline at end of file
diff --git a/Samples/WpfMVVMSample/WpfMVVMSample.sln b/Samples/WpfMVVMSample/WpfMVVMSample.sln
new file mode 100644
index 0000000000..f6924a3728
--- /dev/null
+++ b/Samples/WpfMVVMSample/WpfMVVMSample.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27130.2010
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfMVVMSample", "WpfMVVMSample\WpfMVVMSample.csproj", "{B72F9215-70FF-4155-89BC-9A02CC550447}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B72F9215-70FF-4155-89BC-9A02CC550447}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B72F9215-70FF-4155-89BC-9A02CC550447}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B72F9215-70FF-4155-89BC-9A02CC550447}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B72F9215-70FF-4155-89BC-9A02CC550447}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {D5FA6C7A-26EC-4F45-B539-F20AD40CE0A4}
+ EndGlobalSection
+EndGlobal
diff --git a/Samples/WpfMVVMSample/WpfMVVMSample/App.config b/Samples/WpfMVVMSample/WpfMVVMSample/App.config
new file mode 100644
index 0000000000..731f6de6c2
--- /dev/null
+++ b/Samples/WpfMVVMSample/WpfMVVMSample/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Samples/WpfMVVMSample/WpfMVVMSample/App.xaml b/Samples/WpfMVVMSample/WpfMVVMSample/App.xaml
new file mode 100644
index 0000000000..6efb0d471e
--- /dev/null
+++ b/Samples/WpfMVVMSample/WpfMVVMSample/App.xaml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/Samples/WpfMVVMSample/WpfMVVMSample/App.xaml.cs b/Samples/WpfMVVMSample/WpfMVVMSample/App.xaml.cs
new file mode 100644
index 0000000000..030015fe02
--- /dev/null
+++ b/Samples/WpfMVVMSample/WpfMVVMSample/App.xaml.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace WpfMVVMSample
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ protected override void OnStartup(StartupEventArgs e)
+ {
+ base.OnStartup(e);
+
+ var bootstrapper = new Bootstrapper();
+ bootstrapper.Run();
+ }
+ }
+}
diff --git a/Samples/WpfMVVMSample/WpfMVVMSample/Bootstrapper.cs b/Samples/WpfMVVMSample/WpfMVVMSample/Bootstrapper.cs
new file mode 100644
index 0000000000..9602ee8336
--- /dev/null
+++ b/Samples/WpfMVVMSample/WpfMVVMSample/Bootstrapper.cs
@@ -0,0 +1,43 @@
+using Microsoft.Practices.ServiceLocation;
+using Microsoft.Practices.Unity;
+using Prism.Unity;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using WpfMVVMSample.Converters;
+using WpfMVVMSample.Settings;
+
+namespace WpfMVVMSample
+{
+ public class Bootstrapper : UnityBootstrapper
+ {
+ protected override DependencyObject CreateShell()
+ {
+ return Container.TryResolve();
+ }
+
+ protected override void InitializeShell()
+ {
+ Application.Current.MainWindow.Show();
+ }
+
+ protected override void ConfigureContainer()
+ {
+ base.ConfigureContainer();
+
+ Container.RegisterType(new ContainerControlledLifetimeManager());//singleton
+ }
+
+ protected override void ConfigureServiceLocator()
+ {
+ base.ConfigureServiceLocator();
+
+ var serviceLocator = new UnityServiceLocator(Container);
+ ServiceLocator.SetLocatorProvider(() => serviceLocator);
+
+ }
+ }
+}
diff --git a/Samples/WpfMVVMSample/WpfMVVMSample/Converters/EnumBindingSource.cs b/Samples/WpfMVVMSample/WpfMVVMSample/Converters/EnumBindingSource.cs
new file mode 100644
index 0000000000..02d87b7737
--- /dev/null
+++ b/Samples/WpfMVVMSample/WpfMVVMSample/Converters/EnumBindingSource.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Markup;
+
+namespace WpfMVVMSample.Converters
+{
+ public class EnumBindingSourceExtension : MarkupExtension
+ {
+ private Type _enumType;
+ private Type EnumType
+ {
+ get { return this._enumType; }
+ set
+ {
+ if (value != this._enumType)
+ {
+ if (value != null)
+ {
+ Type enumType = Nullable.GetUnderlyingType(value) ?? value;
+
+ if (!enumType.IsEnum)
+ throw new ArgumentException("Type must be for an Enum.");
+ }
+
+ this._enumType = value;
+ }
+ }
+ }
+
+ public EnumBindingSourceExtension() { }
+
+ public EnumBindingSourceExtension(Type enumType)
+ {
+ this.EnumType = enumType;
+ }
+
+ public override object ProvideValue(IServiceProvider serviceProvider)
+ {
+ if (this._enumType== null)
+ throw new InvalidOperationException("The EnumType must be specified.");
+
+ Type actualEnumType = Nullable.GetUnderlyingType(this._enumType) ?? this._enumType;
+
+ //omits the first enum element, typically "undefined"
+ var enumValues = Enum.GetValues(actualEnumType).Cast