public object GetClrValue(Type propertyType, string propertyValueString) { if (!(propertyType.GetTypeInfo() .IsAssignableFrom(propertyValueString.GetType().GetTypeInfo()))) { TypeConverter converter = null; converter = typeConverterProvider.GetConverterFromProperty(propertyValueString, propertyType); if (converter == null) { converter = typeConverterProvider.GetConverter(propertyType); } if (converter != null) { return(converter.ConvertFromInvariantString(propertyValueString)); } else if (propertyType == typeof(bool)) { return(propertyValueString.Equals("true")); } else if (propertyType == typeof(Color)) { return(Color.FromHex(propertyValueString as string)); } else if (propertyType == typeof(LayoutOptions)) { return(propertyType.GetFieldReliable(propertyValueString).GetValue(null)); } else if (propertyType.GetTypeInfo().IsEnum) { return(Enum.Parse(propertyType, propertyValueString as string)); } else { return(Convert.ChangeType(propertyValueString, propertyType)); } } return(propertyValueString); }
private Xamarin.Forms.TriggerAction CreateTriggerAction(StyleSheet styleSheet, BindableObject styleResourceReferenceHolder, TriggerAction action) { var actionTypeName = typeNameResolver.ResolveFullTypeName(styleSheet.Namespaces, action.Action); var actionType = Type.GetType(actionTypeName); var nativeTriggerAction = (Xamarin.Forms.TriggerAction)Activator.CreateInstance(actionType); foreach (var parameter in action.Parameters) { var parameterName = parameter.Property; object value = null; var parameterValueExpression = parameter.Value.Trim(); //.Substring(parameterName.Length + 1).Trim(); BindableProperty depProp; var type = typeNameResolver.GetClrPropertyType(styleSheet.Namespaces, nativeTriggerAction, parameterName); if (typeNameResolver.IsMarkupExtension(parameterValueExpression)) { value = typeNameResolver.GetMarkupExtensionValue(styleResourceReferenceHolder, parameterValueExpression, styleSheet.Namespaces); } else if ((depProp = typeNameResolver.GetDependencyProperty(styleSheet.Namespaces, actionType, parameterName)) != null) { value = typeNameResolver.GetPropertyValue(actionType, styleResourceReferenceHolder, parameterValueExpression, depProp, styleSheet.Namespaces); } else { value = parameterValueExpression; } if (value is string valueString) { value = typeConverterProvider.GetConverter(type)?.ConvertFromInvariantString(valueString) ?? value; } nativeTriggerAction.GetType().GetRuntimeProperty(parameterName).SetValue(nativeTriggerAction, value); } return(nativeTriggerAction); }
public override BindableObject CreateTrigger(StyleSheet styleSheet, ITrigger trigger, Type targetType, BindableObject styleResourceReferenceHolder) { if (trigger == null) { throw new ArgumentNullException(nameof(trigger)); } if (trigger is Trigger) { var propertyTrigger = trigger as Trigger; var nativeTrigger = new Xamarin.Forms.Trigger(targetType); var bindableProperty = dependencyService.GetBindableProperty(targetType, propertyTrigger.Property); if (bindableProperty == null) { throw new NullReferenceException($"Property '{propertyTrigger.Property}' may not be null (targetType '{targetType.Name}')!"); } nativeTrigger.Property = bindableProperty; nativeTrigger.Value = dependencyService.GetBindablePropertyValue(targetType, nativeTrigger.Property, propertyTrigger.Value); foreach (var styleDeclaration in propertyTrigger.StyleDeclaraionBlock) { var property = typeNameResolver.GetDependencyProperty(styleSheet.Namespaces, targetType, styleDeclaration.Property); if (property == null) { continue; } var value = typeNameResolver.GetPropertyValue(targetType, styleResourceReferenceHolder, styleDeclaration.Value, property); nativeTrigger.Setters.Add(new Setter { Property = property, Value = value }); } return(nativeTrigger); } else if (trigger is DataTrigger) { var dataTrigger = trigger as DataTrigger; var nativeTrigger = new Xamarin.Forms.DataTrigger(targetType); var expression = "{Binding " + dataTrigger.Binding + "}"; var binding = (Binding)markupExtensionParser.ProvideValue(expression, null); nativeTrigger.Binding = binding; nativeTrigger.Value = GetBasicValue(dataTrigger); foreach (var styleDeclaration in dataTrigger.StyleDeclarationBlock) { var property = typeNameResolver.GetDependencyProperty(styleSheet.Namespaces, targetType, styleDeclaration.Property); if (property == null) { continue; } var value = typeNameResolver.GetPropertyValue(targetType, styleResourceReferenceHolder, styleDeclaration.Value, property); nativeTrigger.Setters.Add(new Setter { Property = property, Value = value }); } return(nativeTrigger); } else if (trigger is EventTrigger) { var eventTrigger = trigger as EventTrigger; var nativeTrigger = new Xamarin.Forms.EventTrigger(); nativeTrigger.Event = eventTrigger.Event; foreach (var action in eventTrigger.Actions) { var actionTypeName = typeNameResolver.ResolveFullTypeName(styleSheet.Namespaces, action.Action); var actionType = Type.GetType(actionTypeName); var triggerAction = (Xamarin.Forms.TriggerAction)Activator.CreateInstance(actionType); var parameters = action.Parameters.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => x.Trim()) .ToList(); foreach (var parameter in parameters) { var parameterName = parameter.Split(' ')[0]; object value = null; var parameterValueExpression = parameter.Substring(parameterName.Length + 1).Trim(); BindableProperty depProp; var type = typeNameResolver.GetClrPropertyType(styleSheet.Namespaces, triggerAction, parameterName); if (typeNameResolver.IsMarkupExtension(parameterValueExpression)) { value = typeNameResolver.GetMarkupExtensionValue(styleResourceReferenceHolder, parameterValueExpression); } else if ((depProp = typeNameResolver.GetDependencyProperty(styleSheet.Namespaces, actionType, parameterName)) != null) { value = typeNameResolver.GetPropertyValue(actionType, styleResourceReferenceHolder, parameterValueExpression, depProp); } else { value = parameterValueExpression; } if (value is string valueString) { value = typeConverterProvider.GetConverter(type)?.ConvertFromInvariantString(valueString) ?? value; } triggerAction.GetType().GetRuntimeProperty(parameterName).SetValue(triggerAction, value); } nativeTrigger.Actions.Add(triggerAction); } return(nativeTrigger); } throw new NotSupportedException($"Trigger '{trigger.GetType().FullName}' is not supported!"); }