ValueChanged event remastered
Setter and Getter can now be null
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Property.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Property.cs
index 6f64024..4ccc1ef 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Property.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Property.cs
@@ -33,18 +33,16 @@
         {
             get
             {
-                return Get.Invoke(this)?.Value;
+                return Get?.Invoke(this)?.Value;
             }            
             set
             {
                 if (value != null)
                 {
                     if (value is IValue iValue)
-                        Set.Invoke(this, iValue);
+                        Set?.Invoke(this, iValue);
                     else
-                        Set.Invoke(this, new ElementValue(value, ValueType));
-
-                    ValueChanged?.Invoke(this, new ValueChangedArgs(IdShort, value, ValueType));
+                        Set?.Invoke(this, new ElementValue(value, ValueType));                   
                 }
             }
         }
@@ -79,8 +77,16 @@
                     _value = ElementValue.ToObject(value, valueType.SystemType);
             }
 
-            Get = element  => { return new ElementValue(_value, ValueType); };
-            Set = (element, iValue) => { _value = iValue.Value; };
+            Get = element  => 
+            { 
+                return new ElementValue(_value, ValueType); 
+            };
+
+            Set = (element, iValue) => 
+            { 
+                _value = iValue.Value;
+                OnValueChanged(new ValueChangedArgs(IdShort, _value, ValueType));
+            };
         }
 
         public T ToObject<T>()
@@ -92,6 +98,11 @@
         {
             return new ElementValue(Value, ValueType).ToObject(type);
         }
+
+        protected virtual void OnValueChanged(ValueChangedArgs e)
+        {
+            ValueChanged?.Invoke(this, e);
+        }
     }
     ///<inheritdoc cref="IProperty"/>
     [DataContract]
@@ -99,23 +110,22 @@
     {
         public override ModelType ModelType => ModelType.Property;
         public override DataType ValueType => typeof(TInnerType);
-
-        public new event EventHandler<ValueChangedArgs> ValueChanged;
-        
+       
         [JsonIgnore, IgnoreDataMember]
         public virtual new TInnerType Value
         {
             get
             {
-                return Get.Invoke(this);
+                if (Get != null)
+                    return Get.Invoke(this);
+                else
+                    return default;
             }
             set
             {
                 if (value != null)
                 {
-                    Set.Invoke(this, value);
-                    
-                    ValueChanged?.Invoke(this, new ValueChangedArgs(IdShort, value, ValueType));
+                    Set?.Invoke(this, value);                                       
                 }
             }
         }
@@ -130,7 +140,10 @@
             set
             {
                 _get = value;
-                base.Get = new GetValueHandler(element => new ElementValue<TInnerType>(_get.Invoke(element)));
+                if (value != null)
+                    base.Get = new GetValueHandler(element => new ElementValue<TInnerType>(_get.Invoke(element)));
+                else
+                    base.Get = null;
             }
         }
         [JsonIgnore, IgnoreDataMember]
@@ -140,7 +153,15 @@
             set
             {
                 _set = value;
-                base.Set = new SetValueHandler((element, iValue) => _set.Invoke(element, iValue.ToObject<TInnerType>()));
+                if (value != null)
+                    base.Set = new SetValueHandler((element, iValue) =>
+                    {
+                        TInnerType typedValue = iValue.ToObject<TInnerType>();
+                        _set.Invoke(element, typedValue);
+                        OnValueChanged(new ValueChangedArgs(IdShort, typedValue, ValueType));
+                    });
+                else
+                    base.Set = null;
             }
         }
 
@@ -149,8 +170,14 @@
         [JsonConstructor]
         public Property(string idShort, TInnerType value) : base(idShort, typeof(TInnerType), value) 
         {
-            _get = element => { return base.Get.Invoke(element).ToObject<TInnerType>(); };
-            _set = (element, iValue) => { base.Set.Invoke(element, new ElementValue<TInnerType>(iValue)); };
+            _get = element =>
+            {
+                if (base.Get != null)
+                    return base.Get.Invoke(element).ToObject<TInnerType>();
+                else
+                    return default;
+            };
+            _set = (element, iValue) => { base.Set?.Invoke(element, new ElementValue<TInnerType>(iValue)); };
         }
 
     }