/// <summary> /// Gets the view model path expression. /// </summary> public override string GetViewModelPathExpression(DotvvmBindableControl control, DotvvmProperty property) { // find the parent markup control and calculate number of DataContext changes int numberOfDataContextChanges; var current = control.GetClosestControlBindingTarget(out numberOfDataContextChanges) as DotvvmBindableControl; current.EnsureControlHasId(); return string.Join(".", Enumerable.Range(0, numberOfDataContextChanges).Select(i => "_parent").Concat(new[] { "_controlState_" + current.ID, Expression })); }
/// <summary> /// Translates the expression to client script. /// </summary> public override string TranslateToClientScript(DotvvmBindableControl control, DotvvmProperty property) { ValidateExpression(Expression); // find the parent markup control and calculate number of DataContext changes int numberOfDataContextChanges; var current = control.GetClosestControlBindingTarget(out numberOfDataContextChanges) as DotvvmBindableControl; current.EnsureControlHasId(); return string.Join(".", Enumerable.Range(0, numberOfDataContextChanges).Select(i => "$parent").Concat(new[] { "$controlState()", current.ID + "()", Expression })); }
/// <summary> /// Evaluates the specified expression. /// </summary> public override object Evaluate(DotvvmBindableControl control, DotvvmProperty property) { ValidateExpression(Expression); // find the parent markup control and calculate number of DataContext changes int numberOfDataContextChanges; var current = control.GetClosestControlBindingTarget(out numberOfDataContextChanges) as DotvvmBindableControl; if (current == null || !current.RequiresControlState) { throw new Exception("The {controlState: ...} binding can only be used in a markup control that supports ControlState!"); // TODO: exception handling } else { object value; return current.ControlState.TryGetValue(Expression, out value) ? value : DefaultValue; } }
private DotvvmControl GetRootControl(DotvvmBindableControl control) { return control.GetClosestControlBindingTarget(); }