From 9352ee617bef63136d8fa47d7389e6c378ac70ed Mon Sep 17 00:00:00 2001
From: "harald.martini@student.tugraz.at" <harald.martini@student.tugraz.at>
Date: Mon, 31 May 2021 08:13:23 +0200
Subject: [PATCH] Added Method to Reset Editing enabled of Multistage Parameter

Updated Combobox view
---
 .../Helper/MultistageParameterViewModel.cs    |  59 ++++--
 .../Implementation/JobListViewModel.cs        |   2 +-
 .../Implementation/OutputViewModel.cs         |  23 +--
 .../InterimStageBusVehicleViewModel_v2_8.cs   | 108 +++++-----
 .../MultistageAuxiliariesViewModel.cs         |  45 +----
 .../MultistageParameterComboBoxView.xaml      |   6 +-
 .../ViewModelTests/LoadAndSaveVehicleData.cs  |  20 +-
 .../MultistageAuxiliariesViewModelTests.cs    |  63 +++---
 .../MultistageParameterViewModelTests.cs      |  20 ++
 .../ViewModelTests/VehicleViewModelTests.cs   | 185 +++++++++++++++++-
 10 files changed, 365 insertions(+), 166 deletions(-)
 create mode 100644 Vecto3GUI2020Test/ViewModelTests/MultistageParameterViewModelTests.cs

diff --git a/VECTO3GUI2020/Helper/MultistageParameterViewModel.cs b/VECTO3GUI2020/Helper/MultistageParameterViewModel.cs
index 6029792b22..7d64d6cec0 100644
--- a/VECTO3GUI2020/Helper/MultistageParameterViewModel.cs
+++ b/VECTO3GUI2020/Helper/MultistageParameterViewModel.cs
@@ -11,6 +11,7 @@ using System.Runtime.InteropServices;
 using System.Windows;
 using System.Windows.Controls;
 using Castle.Core.Internal;
+using Castle.Core.Resource;
 using Castle.DynamicProxy.Internal;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Utils;
@@ -29,8 +30,17 @@ namespace VECTO3GUI2020.Helper
 	}
 
 
+	public interface IMultistageParameterViewModel
+	{
+		bool EditingEnabled { get; set; }
+		object CurrentContent { get; set; }
+		object DummyContent { get; set; }
+		ObservableCollection<Enum> AllowedItems { get; set; }
+		object PreviousContent { get; set; }
+		Action<MultistageParameterViewModel> EditingChangedCallback { get; set; }
+	}
 
-	public class MultistageParameterViewModel : ViewModelBase, IDataErrorInfo
+	public class MultistageParameterViewModel : ViewModelBase, IDataErrorInfo, IMultistageParameterViewModel
 	{
 		private bool _editingEnabled;
 		private object _currentContent;
@@ -85,13 +95,11 @@ namespace VECTO3GUI2020.Helper
 				if (DummyContent is Enum dummyEnum)
 				{
 					var enType = dummyEnum.GetType();
-					//GeneratedListItems = new ObservableCollection<typeof(enType)>(Enum.GetValues(enType).Cast<T>().ToList());
 					GeneratedListItems = new ObservableCollection<Enum>(Enum.GetValues(enType).Cast<Enum>().ToList());
 				}
 				else if (CurrentContent is Enum contentEnum)
 				{
 					var enType = contentEnum.GetType();
-					//GeneratedListItems = new ObservableCollection<T>(Enum.GetValues(enType).Cast<T>().ToList());
 					GeneratedListItems = new ObservableCollection<Enum>(Enum.GetValues(enType).Cast<Enum>().ToList());
 				}
 			}
@@ -165,6 +173,10 @@ namespace VECTO3GUI2020.Helper
 					var dummyContent = Convert.ChangeType(0, primitiveType);
 					return dummyContent;
 				}
+
+				if (type == typeof(string)) {
+					return "";
+				}
 				
 
 
@@ -193,11 +205,10 @@ namespace VECTO3GUI2020.Helper
 					_editingChangedCallback?.Invoke(this);
 					if (new_value == false)
 					{
-						if (StoredContent != null) {
+						if (StoredContent != CurrentContent) {
 							StoredContent = CurrentContent;
 						}
 						CurrentContent = null;
-						OnPropertyChanged(nameof(CurrentContent));
 					}
 					else
 					{
@@ -208,11 +219,9 @@ namespace VECTO3GUI2020.Helper
 								CurrentContent = DummyContent;
 							}
 						}
-						OnPropertyChanged(nameof(CurrentContent));
 					}
-
 				}
-				
+				OnPropertyChanged(nameof(CurrentContent));
 				OnPropertyChanged(nameof(EditingEnabled));
 			}
 		}
@@ -222,30 +231,28 @@ namespace VECTO3GUI2020.Helper
 			get => _currentContent;
 			set
 			{
-				if (value != null) {
+				if (value != null) { 
 					EditingEnabled = true;
-				}
+				} 
 
 				var convertedValue = value;
 
-
 				//Convert value if neccessary
 				if (value != null) {
 					if (DummyContent != null) {
 						convertedValue = Convert.ChangeType(value, DummyContent.GetType());
 					}
 				}
-				
-				
 
 				if (SetProperty(ref _currentContent, convertedValue)) {
 					_propertyInfo.SetValue(_parentViewModel, _currentContent);
 					_propertyChangedCallback?.Invoke(this);
 				};
-				
 			}
 		}
 
+
+
 		public object DummyContent
 		{
 			get => _dummyContent;
@@ -261,7 +268,6 @@ namespace VECTO3GUI2020.Helper
 			get => _storedContent;
 			set
 			{
-				//_propertyChangedCallback.Invoke(this);
 				SetProperty(ref _storedContent, value);
 			}
 		}
@@ -271,7 +277,6 @@ namespace VECTO3GUI2020.Helper
 			get => _label;
 			set
 			{
-				_propertyChangedCallback?.Invoke(this);
 				SetProperty(ref _label, value);
 			}
 		}
@@ -281,8 +286,8 @@ namespace VECTO3GUI2020.Helper
 			get => _allowedItems;
 			set
 			{
-				//_propertyChangedCallback?.Invoke(this);
 				SetProperty(ref _allowedItems, value);
+				OnPropertyChanged(nameof(CurrentContent));
 			}
 		}
 
@@ -332,12 +337,11 @@ namespace VECTO3GUI2020.Helper
 		{
 			get
 			{
-				var dataErrorinfo = _parentViewModel as IDataErrorInfo;
-				if (dataErrorinfo == null) {
+				if (!(_parentViewModel is IDataErrorInfo dataErrorInfo)) {
 					return null;
 				}
 
-				return dataErrorinfo[_propertyName];
+				return dataErrorInfo[_propertyName];
 			}
 		}
 
@@ -349,6 +353,21 @@ namespace VECTO3GUI2020.Helper
 			set => _editingChangedCallback = value;
 		}
 
+		/// <summary>
+		/// Sets Editing Enabled flag based on currentvalue
+		/// </summary>
+		/// <returns></returns>
+		public bool UpdateEditingEnabled()
+		{
+			if (CurrentContent == null) {
+				EditingEnabled = false;
+			} else {
+				EditingEnabled = true;
+			}
+
+			return EditingEnabled;
+		}
+		
 
 		#endregion
 	}
diff --git a/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs b/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
index 5a801bd941..71d7b9c58e 100644
--- a/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
+++ b/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs
@@ -163,7 +163,7 @@ namespace VECTO3GUI2020.ViewModel.Implementation
 				new Progress<int>((i) => _outputViewModel.Progress = i),
 				new Progress<string>((msg) => _outputViewModel.StatusMessage = msg)));
 			SimulationRunning = false;
-			_outputViewModel.SumProgress = 0;
+			_outputViewModel.Progress = 0;
 			cancellationTokenSource.Dispose();
         }
 
diff --git a/VECTO3GUI2020/ViewModel/Implementation/OutputViewModel.cs b/VECTO3GUI2020/ViewModel/Implementation/OutputViewModel.cs
index 2782a7156f..345f474799 100644
--- a/VECTO3GUI2020/ViewModel/Implementation/OutputViewModel.cs
+++ b/VECTO3GUI2020/ViewModel/Implementation/OutputViewModel.cs
@@ -10,7 +10,6 @@ using VECTO3GUI2020.ViewModel.Interfaces.Common;
 namespace VECTO3GUI2020.ViewModel
 {
 
-
 	public class OutputViewModel : ViewModelBase, IOutputViewModel
 	{
 		private object _messageLock = new Object();
@@ -20,16 +19,13 @@ namespace VECTO3GUI2020.ViewModel
 
 		public ObservableCollection<MessageEntry> Messages
 		{
-			get
-			{
-				return _messages;
-			}
+			get { return _messages; }
 		}
 
-		public double SumProgress
+		public int Progress
 		{
-			get => _sumProgress;
-			set => SetProperty(ref _sumProgress, value);
+			get => _progress;
+			set => SetProperty(ref _progress, value);
 		}
 
 		public string StatusMessage
@@ -41,16 +37,9 @@ namespace VECTO3GUI2020.ViewModel
 
 		public OutputViewModel()
 		{
-			BindingOperations.EnableCollectionSynchronization(Messages, _messageLock );
-		}
-
-		public void SetProgress(double sumProgress, IList<double> subProgress)
-		{
-			SumProgress = sumProgress;
-
-			SubProgress = subProgress;
-
+			BindingOperations.EnableCollectionSynchronization(Messages, _messageLock);
 		}
+	}
 
 	public interface IOutputViewModel : IMainViewModel
 	{
diff --git a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/InterimStageBusVehicleViewModel_v2_8.cs b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/InterimStageBusVehicleViewModel_v2_8.cs
index a2c6a05b8f..acb7fcad01 100644
--- a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/InterimStageBusVehicleViewModel_v2_8.cs
+++ b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/InterimStageBusVehicleViewModel_v2_8.cs
@@ -226,7 +226,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			_parameterViewModels[nameof(EntranceHeightInMm)].PreviousContent = ConsolidatedEntranceHeightInMm;
 			_parameterViewModels[nameof(EntranceHeightInMm)].DummyContent = ConvertedSIDummyCreator.CreateMillimeterDummy();
 
-			_parameterViewModels[nameof(AirdragModifiedEnum)].PreviousContent = ConsolidatedAirdragmodified;
+			_parameterViewModels[nameof(AirdragModifiedEnum)].PreviousContent = ConsolidatedAirdragModifiedEnum;
 
 
 			///Set up editing groups
@@ -360,9 +360,11 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			ATEcoRollReleaseLockupClutch = vehicleInputData.ADAS?.ATEcoRollReleaseLockupClutch;
 			AirdragModifiedMultistage = vehicleInputData.AirdragModifiedMultistage;
 			AirdragModifiedMultistageEditingEnabled = false;
-			OnPropertyChanged(String.Empty);
-			
-
+			foreach (var multistageParameterViewModel in _parameterViewModels.Values)
+			{
+				multistageParameterViewModel.UpdateEditingEnabled();
+			}
+			OnPropertyChanged(string.Empty);
 		}
 
 
@@ -380,7 +382,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 		private int? _numberOfPassengersUpperDeck;
 		private int? _numberOfPassengersLowerDeck;
 		private Kilogram _grossVehicleMassRating;
-		private Meter _entranceHeight;
+
 		private bool? _lowEntry;
 		private VehicleCode? _vehicleCode;
 		private RegistrationClass? _registeredClass;
@@ -390,9 +392,11 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 		private ConsumerTechnology? _doorDriveTechnology;
 		private TankSystem? _tankSystem;
 		private Kilogram _curbMassChassis;
-		private Meter _length;
-		private Meter _height;
-		private Meter _width;
+		private ConvertedSI _lengthInMm;
+		private ConvertedSI _heightMm;
+		private ConvertedSI _widthInMm;
+		private ConvertedSI _entranceHeightInMm;
+
 
 
 		public string Manufacturer
@@ -435,36 +439,31 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 					_parameterViewModels[nameof(WidthInMm)].EditingEnabled = value;
 					_parameterViewModels[nameof(EntranceHeightInMm)].EditingEnabled = value;
 				}
-			
 			}
 		}
 
 		public ConvertedSI HeightInMm
 		{
-			get { return Height?.ConvertToMilliMeter(); }
-			set { Height = value?.ConvertToMeter(); }
+			get => _heightMm;
+			set => SetProperty(ref _heightMm, value);
 		}
 
 		public ConvertedSI ConsolidatedHeightInMm
 		{
-			get { return ConsolidatedVehicleData?.Height?.ConvertToMilliMeter(); }
-			set { throw new NotImplementedException(); }
+			get => ConsolidatedVehicleData?.Height?.ConvertToMilliMeter();
+			set => throw new NotImplementedException();
 		}
 
 		public Meter Height
 		{
-			get { return _height; }
-			set
-			{
-				SetProperty(ref _height, value);
-				OnPropertyChanged(nameof(HeightInMm));
-			}
+			get => HeightInMm?.ConvertToMeter();
+			set => HeightInMm = value?.ConvertToMilliMeter();
 		}
 
 		public ConvertedSI LengthInMm
 		{
-			get { return Length?.ConvertToMilliMeter(); }
-			set { Length = value?.ConvertToMeter(); }
+			get { return _lengthInMm; }
+			set => SetProperty(ref _lengthInMm, value);
 		}
 
 		public ConvertedSI ConsolidatedLengthInMm
@@ -476,18 +475,14 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 
 		public Meter Length
 		{
-			get { return _length; }
-			set
-			{
-				SetProperty(ref _length, value);
-				OnPropertyChanged(nameof(WidthInMm));
-			}
+			get => LengthInMm?.ConvertToMeter();
+			set => LengthInMm = value?.ConvertToMilliMeter();
 		}
 
 		public ConvertedSI WidthInMm
 		{
-			get { return Width?.ConvertToMilliMeter(); }
-			set { Width = value?.ConvertToMeter(); }
+			get => _widthInMm;
+			set => SetProperty(ref _widthInMm, value);
 		}
 
 		public ConvertedSI ConsolidatedWidthInMm
@@ -499,12 +494,8 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 
 		public Meter Width
 		{
-			get { return _width; }
-			set
-			{
-				SetProperty(ref _width, value);
-				OnPropertyChanged(nameof(WidthInMm));
-			}
+			get => WidthInMm?.ConvertToMeter();
+			set => WidthInMm = value?.ConvertToMilliMeter();
 		}
 
 		public ConvertedSI ConsolidatedEntranceHeightInMm
@@ -515,23 +506,15 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 
 		public ConvertedSI EntranceHeightInMm
 		{
-			get { return EntranceHeight?.ConvertToMilliMeter(); }
-			set
-			{
-				EntranceHeight = value?.ConvertToMeter(); 
-				
-			}
+			get => _entranceHeightInMm;
+			set => SetProperty(ref _entranceHeightInMm, value);
 		}
 
 
 		public Meter EntranceHeight
 		{
-			get => _entranceHeight;
-			set
-			{
-				SetProperty(ref _entranceHeight, value);
-				OnPropertyChanged(nameof(EntranceHeightInMm));
-			}
+			get => EntranceHeightInMm?.ConvertToMeter();
+			set => EntranceHeightInMm = value?.ConvertToMilliMeter();
 		}
 
 		#endregion
@@ -618,7 +601,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			}
 		}
 
-		public AIRDRAGMODIFIED? ConsolidatedAirdragmodified
+		public AIRDRAGMODIFIED? ConsolidatedAirdragModifiedEnum
 		{
 			get
 			{
@@ -636,20 +619,29 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			get => _airdragModifiedMultistage;
 			set
 			{
+				
 				if (SetProperty(ref _airdragModifiedMultistage, value)) {
 					AirdragModifiedEnum = value.toAirdragModifiedEnum();
 				};
+
 			}
 		}
 
+		public bool AirdragModifiedMultistageMandatory
+		{
+			get => _airdragModifiedMultistageMandatory;
+			set => SetProperty(ref _airdragModifiedMultistageMandatory, value);
+		}
+
+		private bool airdragModifiedMandatory = false;
 
 		public bool AirdragModifiedMultistageEditingEnabled
 		{
 			get
 			{
 				//IF MODIFIED ONCE IT HAS TO BE SET
-				if (_consolidatedVehicleData?.AirdragModifiedMultistage != null) {
-					_airdragModifiedEditingEnabled = true;
+				if (airdragModifiedMandatory) {
+
 				}
 				return _airdragModifiedEditingEnabled;
 			}
@@ -1075,8 +1067,18 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 						}
 						break;
 					default:
-						if (_parameterViewModels[propertyName].EditingEnabled == true && this.GetType().GetProperty(propertyName)?.GetValue(this) == null) {
-							result = $"{NameResolver.ResolveName(propertyName, BusStrings.ResourceManager, Strings.ResourceManager)} has to be set if editing is enabled}}";
+						if (_parameterViewModels[propertyName].EditingEnabled) {
+							var propertyValue = this.GetType().GetProperty(propertyName)?.GetValue(this);
+							if (propertyValue == null) {
+								result =
+									$"{NameResolver.ResolveName(propertyName, BusStrings.ResourceManager, Strings.ResourceManager)} has to be set if editing is enabled}}";
+							} else { 
+								if (propertyValue.GetType() == typeof(string) && string.IsNullOrWhiteSpace(propertyValue as string))
+								{
+									result =
+										$"{NameResolver.ResolveName(propertyName, BusStrings.ResourceManager, Strings.ResourceManager)} has to be set if editing is enabled}}";
+								}
+							}
 						}
 
 						break;
@@ -1109,6 +1111,8 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 		#endregion
 
 		private IndexedStorage<bool> _editingEnabledDictionary;
+		private bool _airdragModifiedMultistageMandatory;
+
 		public IndexedStorage<bool> EditingEnabledDictionary
 		{
 			get
diff --git a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageAuxiliariesViewModel.cs b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageAuxiliariesViewModel.cs
index be883d42c0..202664fe94 100644
--- a/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageAuxiliariesViewModel.cs
+++ b/VECTO3GUI2020/ViewModel/MultiStage/Implementation/MultistageAuxiliariesViewModel.cs
@@ -235,10 +235,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 		public HeatPumpMode? HeatPumpModeDriverCompartment
 		{
 			get => _heatPumpModeDriverCompartment;
-			set
-			{
-				SetProperty(ref _heatPumpModeDriverCompartment, value);
-			}
+			set => SetProperty(ref _heatPumpModeDriverCompartment, value);
 		}
 
 		private ObservableCollection<Enum> _heatPumpModeDriverCompartmentAllowedValues;
@@ -274,7 +271,6 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 						HeatPumpModePassengerCompartmentAllowedValues =
 							EnumHelper.GetValuesAsObservableCollectionExcluding<Enum, HeatPumpMode>(
 								items: HeatPumpMode.N_A);
-						//HeatPumpModePassengerCompartment = HeatPumpMode.cooling;
 					}
 				}
 			}
@@ -283,11 +279,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 		public HeatPumpMode? HeatPumpModePassengerCompartment
 		{
 			get => _heatPumpModePassengerCompartment;
-			set
-			{
-				SetProperty(ref _heatPumpModePassengerCompartment, value);
-				
-			}
+			set => SetProperty(ref _heatPumpModePassengerCompartment, value);
 		}
 
 		private ObservableCollection<Enum> _heatPumpModePassengerCompartmentAllowedValues;
@@ -436,32 +428,9 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			HeadlightsLED = componentsAuxiliaryInputData.ElectricConsumers?.HeadlightsLED;
 			BrakelightsLED = componentsAuxiliaryInputData.ElectricConsumers?.BrakelightsLED;
 
-			OnPropertyChanged(String.Empty);
-		}
-
-		private void ResetData()
-		{
-			HeatPumpGroupEditingEnabled = false;
-			SystemConfiguration = null;
-			HeatPumpTypeDriverCompartment = null;
-			HeatPumpModeDriverCompartment = null;
-			HeatPumpTypePassengerCompartment = null;
-			HeatPumpModePassengerCompartment = null;
-
-			AuxHeaterPower = null;
-			DoubleGlazing = null;
-			AdjustableAuxiliaryHeater = null;
-			SeparateAirDistributionDucts = null;
-			WaterElectricHeater = null;
-			AirElectricHeater = null;
-			OtherHeatingTechnology = null;
-
-			InteriorLightsLED = null;
-			DayrunninglightsLED = null;
-			PositionlightsLED = null;
-			HeadlightsLED = null;
-			BrakelightsLED = null;
-
+			foreach (var multistageParameterViewModel in _parameterViewModels.Values) {
+				multistageParameterViewModel.UpdateEditingEnabled();
+			}
 			OnPropertyChanged(String.Empty);
 		}
 
@@ -582,6 +551,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 			HeatPumpModeDriverCompartmentAllowedValues = EnumHelper.GetValuesAsObservableCollectionExcluding<Enum, HeatPumpMode>(HeatPumpMode.N_A);
 			HeatPumpModePassengerCompartmentAllowedValues =
 				EnumHelper.GetValuesAsObservableCollectionExcluding<Enum, HeatPumpMode>(HeatPumpMode.N_A);
+
 			SystemConfigurationAllowedValues =
 				EnumHelper.GetValuesAsObservableCollectionExcluding<Enum, BusHVACSystemConfiguration>(
 					BusHVACSystemConfiguration.Unknown);
@@ -592,8 +562,7 @@ namespace VECTO3GUI2020.ViewModel.MultiStage.Implementation
 		{
 			var propertyChanged = base.SetProperty(ref field, value, propertyName);
 
-			if (propertyChanged && _parameterViewModels != null && _parameterViewModels.ContainsKey(propertyName))
-			{
+			if (propertyChanged && _parameterViewModels != null && _parameterViewModels.ContainsKey(propertyName)) {
 				_parameterViewModels[propertyName].CurrentContent = value;
 			}
 			return propertyChanged;
diff --git a/VECTO3GUI2020/Views/Multistage/CustomControls/MultistageParameterComboBoxView.xaml b/VECTO3GUI2020/Views/Multistage/CustomControls/MultistageParameterComboBoxView.xaml
index e930e5a7b7..ddb9a253e4 100644
--- a/VECTO3GUI2020/Views/Multistage/CustomControls/MultistageParameterComboBoxView.xaml
+++ b/VECTO3GUI2020/Views/Multistage/CustomControls/MultistageParameterComboBoxView.xaml
@@ -43,7 +43,11 @@
             <!--SelectedIndex="{Binding EditingEnabled, ElementName=MultistageParameterControl, Converter={StaticResource BoolToIntConverter}}"-->
             <!--ItemsSource="{Binding ListItems, ElementName=MultistageParameterControl}"-->
             <ComboBox x:Name="comboBoxCurrent" Grid.Column="3" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="2 0 2 0" 
-                      SelectedItem="{Binding CurrentContent, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
+                      SelectedValue="{Binding CurrentContent,
+                            Mode=TwoWay, 
+                            ValidatesOnExceptions=True, 
+                            ValidatesOnDataErrors=True, 
+                            UpdateSourceTrigger=PropertyChanged}"
                       IsEnabled="{Binding EditingEnabled}"
                       IsEditable="False">
                 <ComboBox.ItemsSource>
diff --git a/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs b/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
index ff2bb6a09b..4234410ec7 100644
--- a/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/LoadAndSaveVehicleData.cs
@@ -4,6 +4,7 @@ using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 using System.Xml;
+using Castle.Core.Internal;
 using Castle.DynamicProxy.Generators.Emitters.SimpleAST;
 using Moq;
 using Ninject;
@@ -11,6 +12,7 @@ using NUnit.Framework;
 using TUGraz.VectoCommon.BusAuxiliaries;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.XML;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
@@ -169,8 +171,10 @@ namespace Vecto3GUI2020Test
 			var vehicleViewModel =
 				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as IMultistageVehicleViewModel;
 			Assert.NotNull(vehicleViewModel);
-			Assert.Null(vehicleViewModel.Manufacturer);
-			Assert.Null(vehicleViewModel.ManufacturerAddress);
+			Assert.IsTrue(vehicleViewModel.Manufacturer.IsNullOrEmpty());
+			Assert.IsTrue(vehicleViewModel.ManufacturerAddress.IsNullOrEmpty());
+			Assert.IsTrue(vehicleViewModel.VIN.IsNullOrEmpty());
+			Assert.IsNull(vehicleViewModel.Model);
 
 			var vehicleViewModel_v2_8 = vehicleViewModel as DeclarationInterimStageBusVehicleViewModel_v2_8;
 			Assert.NotNull(vehicleViewModel_v2_8);
@@ -191,7 +195,7 @@ namespace Vecto3GUI2020Test
 			Assert.IsFalse(vehicleViewModel_v2_8.AirdragModifiedMultistageEditingEnabled);
 
 			Assert.IsNull(vehicleViewModel_v2_8.AirdragModifiedMultistage);
-			Assert.IsNull(vehicleViewModel_v2_8.ConsolidatedAirdragmodified);
+			Assert.IsNull(vehicleViewModel_v2_8.ConsolidatedAirdragModifiedEnum);
 			Assert.IsNull(vehicleViewModel_v2_8.AirdragModifiedEnum);
 			
 
@@ -265,7 +269,7 @@ namespace Vecto3GUI2020Test
 			Assert.AreEqual(LegislativeClass.M3, vehicle.LegislativeClass);
 			Assert.AreEqual(500, vehicle.CurbMassChassis.Value());//CorrectedActualMass
 			Assert.AreEqual(3500, vehicle.GrossVehicleMassRating.Value());//TechnicalPermissibleMaximumLadenMass
-			Assert.AreEqual(false, vehicle.AirdragModifiedMultistage);
+			//Assert.AreEqual(false, vehicle.AirdragModifiedMultistage);
 			Assert.AreEqual(TankSystem.Compressed, vehicle.TankSystem);//NgTankSystem
 			Assert.AreEqual(RegistrationClass.II_III, vehicle.RegisteredClass);//ClassBus
 			Assert.AreEqual(0, vehicle.NumberOfPassengersLowerDeck);
@@ -275,9 +279,11 @@ namespace Vecto3GUI2020Test
 			Assert.AreEqual(2.5, vehicle.Height.Value());//HeightIntegratedBody
 			Assert.AreEqual(9.5, vehicle.Length.Value());
 			Assert.AreEqual(2.5, vehicle.Width.Value());
-			Assert.AreEqual(2500, vehicle.HeightInMm.Value);
-			Assert.AreEqual(9500, vehicle.LengthInMm.Value);
-			Assert.AreEqual(2500, vehicle.WidthInMm.Value);
+
+			Assert.AreEqual(2500, (vehicle.ParameterViewModels[nameof(vehicle.HeightInMm)].CurrentContent as ConvertedSI).Value);
+			Assert.AreEqual(9500, (vehicle.ParameterViewModels[nameof(vehicle.LengthInMm)].CurrentContent as ConvertedSI).Value);
+			Assert.AreEqual(2500, (vehicle.ParameterViewModels[nameof(vehicle.WidthInMm)].CurrentContent as ConvertedSI).Value);
+			
 
 			Assert.AreEqual(2, vehicle.EntranceHeight.Value());
 			Assert.AreEqual(ConsumerTechnology.Electrically, vehicle.DoorDriveTechnology);
diff --git a/Vecto3GUI2020Test/ViewModelTests/MultistageAuxiliariesViewModelTests.cs b/Vecto3GUI2020Test/ViewModelTests/MultistageAuxiliariesViewModelTests.cs
index 779851c00a..b9ac2c7fa7 100644
--- a/Vecto3GUI2020Test/ViewModelTests/MultistageAuxiliariesViewModelTests.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/MultistageAuxiliariesViewModelTests.cs
@@ -13,31 +13,7 @@ namespace Vecto3GUI2020Test.ViewModelTests
     public class MultistageAuxiliariesViewModelTests : ViewModelTestBase
     {
 
-		//[Test]
-		//public void TestAllowedValuesHeatPumpMode()
-		//{
-		//	var vm = loadFile(consolidated_multiple_stages_airdrag);
-
-
-		//	var vehicle = vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
-		//		DeclarationInterimStageBusVehicleViewModel_v2_8;
-
-		//	var auxVm = vehicle.MultistageAuxiliariesViewModel as MultistageAuxiliariesViewModel;
-
-
-		//	auxVm.HeatPumpTypeDriverCompartment = HeatPumpType.none;
-		//	Assert.IsTrue(auxVm.HeatPumpModeDriverCompartmentAllowedValues.Contains(HeatPumpMode.N_A));
-		//	Assert.IsFalse(auxVm.HeatPumpModeDriverCompartmentAllowedValues.Contains(HeatPumpMode.cooling));
-		//	Assert.IsFalse(auxVm.HeatPumpModeDriverCompartmentAllowedValues.Contains(HeatPumpMode.heating));
-		//	Assert.IsFalse(auxVm.HeatPumpModeDriverCompartmentAllowedValues.Contains(HeatPumpMode.heating_and_cooling));
-
-
-		//	auxVm.HeatPumpTypeDriverCompartment = HeatPumpType.R_744;
-		//	Assert.IsFalse(auxVm.HeatPumpModePassengerCompartmentAllowedValues.Contains(HeatPumpMode.N_A));
-
-
-
-		//}
+	
 
 		[Test]
 		public void TestAllowedValuesHeatPumpModePassenger()
@@ -71,6 +47,43 @@ namespace Vecto3GUI2020Test.ViewModelTests
         }
 
 
+		[Test]
+		public void TestEnumParameters()
+		{
+			var auxVm = new MultistageAuxiliariesViewModel(null);
+			auxVm.HeatPumpTypeDriverCompartment = HeatPumpType.none;
+			Assert.IsTrue(auxVm.HeatPumpGroupEditingEnabled);
+			auxVm.HeatPumpTypeDriverCompartment = HeatPumpType.R_744;
+			Assert.IsTrue(auxVm.HeatPumpGroupEditingEnabled);
+
+			auxVm.HeatPumpGroupEditingEnabled = false;
+			auxVm.ParameterViewModels[nameof(auxVm.HeatPumpTypePassengerCompartment)].CurrentContent =
+				HeatPumpType.R_744;
+			Assert.IsTrue(auxVm.HeatPumpGroupEditingEnabled);
+
+			auxVm.ParameterViewModels[nameof(auxVm.HeatPumpTypePassengerCompartment)].CurrentContent =
+				HeatPumpType.none;
+
+
+			Assert.IsTrue(auxVm.HeatPumpGroupEditingEnabled);
+
+		}
+
+		[Test]
+		public void TestEnum()
+		{
+			var auxVm = new MultistageAuxiliariesViewModel(null);
+			auxVm.HeatPumpTypeDriverCompartment = HeatPumpType.none;
+			auxVm.HeatPumpModeDriverCompartment = HeatPumpMode.N_A;
+			auxVm.HeatPumpGroupEditingEnabled = false;
+			auxVm.HeatPumpGroupEditingEnabled = true;
+			Assert.AreEqual(HeatPumpMode.N_A, auxVm.HeatPumpModeDriverCompartment);
+			Assert.AreEqual(HeatPumpMode.N_A,
+				auxVm.ParameterViewModels[nameof(auxVm.HeatPumpModeDriverCompartment)].CurrentContent);
+
+		}
+
+
 
 
 
diff --git a/Vecto3GUI2020Test/ViewModelTests/MultistageParameterViewModelTests.cs b/Vecto3GUI2020Test/ViewModelTests/MultistageParameterViewModelTests.cs
new file mode 100644
index 0000000000..7d75d07611
--- /dev/null
+++ b/Vecto3GUI2020Test/ViewModelTests/MultistageParameterViewModelTests.cs
@@ -0,0 +1,20 @@
+using NUnit.Framework;
+using VECTO3GUI2020.Annotations;
+
+namespace Vecto3GUI2020Test.ViewModelTests
+{
+	[TestFixture]
+	public class MultistageParameterViewModelTests
+	{
+		[Test]
+		public void EditingEnabledOnContentChanged()
+		{
+			
+
+		}
+
+
+
+
+	}
+}
\ No newline at end of file
diff --git a/Vecto3GUI2020Test/ViewModelTests/VehicleViewModelTests.cs b/Vecto3GUI2020Test/ViewModelTests/VehicleViewModelTests.cs
index b71e245480..83ff7cd316 100644
--- a/Vecto3GUI2020Test/ViewModelTests/VehicleViewModelTests.cs
+++ b/Vecto3GUI2020Test/ViewModelTests/VehicleViewModelTests.cs
@@ -1,10 +1,13 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using NUnit.Framework;
 using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Utils;
+using VECTO3GUI2020.Annotations;
 using VECTO3GUI2020.ViewModel.MultiStage.Implementation;
 
 namespace Vecto3GUI2020Test.ViewModelTests
@@ -19,7 +22,6 @@ namespace Vecto3GUI2020Test.ViewModelTests
 		{
 			var vm = loadFile(consolidated_multiple_stages_airdrag);
 
-
 			var vehicleVM = vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
 				DeclarationInterimStageBusVehicleViewModel_v2_8;
 
@@ -29,10 +31,6 @@ namespace Vecto3GUI2020Test.ViewModelTests
 
 			vehicleVM.AirdragModifiedMultistage = false; //should not change the value
 			Assert.IsTrue(vehicleVM.AirdragModifiedMultistageEditingEnabled);
-
-
-
-
 		}
 
 		[Test]
@@ -45,11 +43,188 @@ namespace Vecto3GUI2020Test.ViewModelTests
 					DeclarationInterimStageBusVehicleViewModel_v2_8;
 
 			Assert.IsFalse(vehicleVM.AirdragModifiedMultistageEditingEnabled);
+		}
+
+		/// <summary>
+		///  1st interim stage adds AirDrag component 
+		///		=> 'AirdragModifiedMultistage' not present in input, VIF 2, Airdrag Component in VIF
+		///		=> 'AirdragModifiedMultistage' required in all consecutive stages
+		/// </summary>
+		[Test]
+		public void airdragComponentLoadedFirstTime()
+		{
+			///Load VIF without airdrag 
+
+			var vm = loadFile(primary_vehicle_only);
+			var vehicleVM =
+				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
+					DeclarationInterimStageBusVehicleViewModel_v2_8;
 
+			//var airdragName 
 		}
+		/// <summary>
+		///  no airdrag component set in VIF => AirdragModifiedMultistage is disabled
+		/// </summary>
+		[Test]
+		public void airdragModifiedDisabled()
+		{
+			var vm = loadFile(primary_vehicle_only);
+			var vehicleVM =
+				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
+					DeclarationInterimStageBusVehicleViewModel_v2_8;
+		}
+		/// <summary>
+		/// airdrag component is in VIF set => AirdragModifiedMultistage is mandatory
+		/// </summary>
+		[Test]
+
+		public void airdragModifiedMandatory()
+		{
+			
+		}
+
+
+
 
 		#endregion
 
+		[Test]
+		public void restoreValuesWhenEditingAgain()
+		{
+			var vm = loadFile(primary_vehicle_only);
+			var vehicleVM =
+				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
+					DeclarationInterimStageBusVehicleViewModel_v2_8;
+			var enteredString = "test";
+			var modelParam = vehicleVM.ParameterViewModels[nameof(vehicleVM.Model)];
+			//Null after loading
+			Assert.IsNull(vehicleVM.Model);
+
+
+			//Enable Editing
+			modelParam.EditingEnabled = true;
+			Assert.IsNotNull(vehicleVM.Model);
+
+			//Enter Value 
+			modelParam.CurrentContent = enteredString;
+
+			//Stored To VM
+			Assert.AreEqual(vehicleVM.Model, enteredString);
+
+			//DisableEditing
+			modelParam.EditingEnabled = false;
+			//Currentvalue stored in storedcontent
+			Assert.AreEqual(enteredString, modelParam.StoredContent);
+
+
+			//Value is null again
+			Assert.IsNull(vehicleVM.Model);
+
+			modelParam.EditingEnabled = true;
+			Assert.AreEqual(modelParam.CurrentContent, enteredString);
+
+			//Change value 
+			var enteredString2 = "test2";
+            modelParam.CurrentContent = enteredString2;
+			modelParam.EditingEnabled = false;
+			modelParam.EditingEnabled = true;
+			Assert.AreEqual(enteredString2, modelParam.CurrentContent);
+
+
+			//modify through CurrentContentProperty
+			modelParam.EditingEnabled = false;
+			modelParam.CurrentContent = enteredString;
+			Assert.AreEqual(modelParam.CurrentContent, enteredString);
+			Assert.IsTrue(modelParam.EditingEnabled);
+
+		}
+
+		[Test]
+		public void SIDummyCreation()
+		{
+
+			var vm = loadFile(primary_vehicle_only);
+			var vehicleVM =
+				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
+					DeclarationInterimStageBusVehicleViewModel_v2_8;
+
+			Assert.IsNull(vehicleVM.CurbMassChassis?.Value());
+			var curbMassParameter = vehicleVM.ParameterViewModels[nameof(vehicleVM.CurbMassChassis)];
+
+			Assert.IsNotNull(curbMassParameter.DummyContent);
+			Assert.IsTrue(curbMassParameter.DummyContent is Kilogram);
+
+			curbMassParameter.EditingEnabled = true;
+			Assert.IsNotNull(vehicleVM.CurbMassChassis);
+		}
+
+
+
+		[Test]
+		public void loadVehicleDataAgainUnset()
+		{
+
+
+
+		}
+
+		[Test]
+		public void NoErrorAfterDataLoading()
+		{
+			var vm = loadFile(primary_vehicle_only);
+			var vehicleVM =
+				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
+					DeclarationInterimStageBusVehicleViewModel_v2_8;
+			getMockDialogHelper(stageInputFullSample);
+			var vmConc = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
+			vmConc.LoadVehicleDataCommand.Execute(null);
+			Assert.IsFalse(vmConc.ManufacturingStageViewModel.VehicleViewModel.HasErrors);
+			
+		}
+
+		[Test]
+		public void groupEditing()
+		{
+			var vm = loadFile(primary_vehicle_only);
+			var vehicleVM =
+				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
+					DeclarationInterimStageBusVehicleViewModel_v2_8;
+
+			vehicleVM.NumberOfPassengersUpperDeck = 2;
+
+			Assert.IsTrue(vehicleVM.NumberOfPassengersEditingEnabled);
+			Assert.AreEqual(2, vehicleVM.NumberOfPassengersUpperDeck);
+			vehicleVM.NumberOfPassengersLowerDeck = 3;
+			Assert.AreEqual(3, vehicleVM.NumberOfPassengersLowerDeck);
+		}
+
+
+		[Test]
+		public void automaticallyEnableEditingWhenContentIsSet()
+		{
+			var vm = loadFile(primary_vehicle_only);
+			var vehicleVM =
+				vm.MultiStageJobViewModel.ManufacturingStageViewModel.Vehicle as
+					DeclarationInterimStageBusVehicleViewModel_v2_8;
+
+			
+			vehicleVM.NumberOfPassengersUpperDeck = 2;
+			Assert.IsTrue(vehicleVM.NumberOfPassengersEditingEnabled);
+
+			vehicleVM.NumberOfPassengersUpperDeck = null;
+
+			getMockDialogHelper(stageInputFullSample);
+			var vmConc = vm.MultiStageJobViewModel as MultiStageJobViewModel_v0_1;
+			vmConc.LoadVehicleDataCommand.Execute(null);
+
+
+			Assert.IsTrue(vehicleVM.ParameterViewModels[nameof(vehicleVM.NumberOfPassengersUpperDeck)].EditingEnabled);
+			Assert.IsTrue(vehicleVM.NumberOfPassengersEditingEnabled);
+		}
+
+
+
+
 		#region ADAS
 		[Test]
 		public void loadPrimaryAndEdit()
-- 
GitLab