/// <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."); } }
public static void AddKnockoutDataBind(this IHtmlWriter writer, string name, DotvvmBindableObject control, DotvvmProperty property, Action?nullBindingAction = null, string?valueUpdate = null, bool renderEvenInServerRenderingMode = false, bool setValueBack = false) { var expression = control.GetValueBinding(property); if (expression != null && (!control.RenderOnServer || renderEvenInServerRenderingMode)) { writer.AddKnockoutDataBind(name, expression.GetKnockoutBindingExpression(control)); if (valueUpdate != null) { writer.AddKnockoutDataBind("valueUpdate", $"'{valueUpdate}'"); } } else { nullBindingAction?.Invoke(); if (setValueBack && expression != null) { control.SetValue(property, expression.Evaluate(control)); } } }
/// Sets an expected data context type public static void SetDataContextType(this DotvvmBindableObject obj, DataContextStack stack) => obj.SetValue(Internal.DataContextTypeProperty, stack);