/// <summary> /// Copies the value of a property from this <see cref="DotvvmBindableObject"/> (source) to a property of another <see cref="DotvvmBindableObject"/> (target). /// </summary> /// <exception cref="DotvvmControlException">Gets thrown if copying fails and <paramref name="throwOnFailure"/> is set to true</exception> /// <param name="sourceProperty">The <see cref="DotvvmProperty"/> whose value will be copied</param> /// <param name="target">The <see cref="DotvvmBindableObject"/> that holds the value of the <paramref name="targetProperty"/></param> /// <param name="targetProperty">The <see cref="DotvvmProperty"/> to which <paramref name="sourceProperty"/> will be copied</param> /// <param name="throwOnFailure">Determines whether to throw an exception if copying fails</param> protected void CopyProperty(DotvvmProperty sourceProperty, DotvvmBindableObject target, DotvvmProperty targetProperty, bool throwOnFailure = false) { if (throwOnFailure && !targetProperty.MarkupOptions.AllowBinding && !targetProperty.MarkupOptions.AllowHardCodedValue) { throw new DotvvmControlException(this, $"TargetProperty: {targetProperty.FullName} doesn't allow bindings nor hard coded values"); } if (targetProperty.MarkupOptions.AllowBinding && HasBinding(sourceProperty)) { target.SetBinding(targetProperty, GetBinding(sourceProperty)); } else if (targetProperty.MarkupOptions.AllowHardCodedValue && IsPropertySet(sourceProperty)) { target.SetValue(targetProperty, GetValue(sourceProperty)); } else if (throwOnFailure) { throw new DotvvmControlException(this, $"Value of {sourceProperty.FullName} couldn't be copied to targetProperty: {targetProperty.FullName}, because {targetProperty.FullName} is not set."); } }