/// <summary> /// Creates a new mutator from the specified XML element. /// </summary> private static UvmlMutator CreateMutatorForXmlElement(UltravioletContext uv, XElement parent, XElement element, Type templatedParentType, Type templatedObjectType, CultureInfo cultureInfo) { var name = element.Name.LocalName; var value = default(UvmlNode); var target = default(Object); var targetType = default(Type); var targetKind = default(UvmlMutatorTarget); var elementChildren = element.Elements().ToList(); if (elementChildren.Any() || element.IsEmpty) { targetKind = GetMutatorTarget(uv, element.Name.LocalName, null, templatedObjectType, out target, out targetType); var itemType = default(Type); if (UvmlCollectionItemMutatorBase.IsSupportedCollectionType(targetType, out itemType)) { var items = elementChildren.Select(x => CreateTemplateFromXml(uv, x, templatedParentType, itemType, cultureInfo)).ToList(); return(CreateMutatorForCollection(uv, targetKind, target, items)); } else { if (elementChildren.Count() > 1) { throw new UvmlException(PresentationStrings.InvalidChildElements.Format(name)); } value = CreateTemplateFromXml(uv, elementChildren.Single(), templatedParentType, targetType, cultureInfo); } } else { targetKind = GetMutatorTarget(uv, element.Name.LocalName, element.Value, templatedObjectType, out target, out targetType); value = new UvmlLiteral(element.Value, targetType, cultureInfo); } return(CreateMutatorForTarget(targetKind, templatedParentType, templatedObjectType, target, value)); }
/// <summary> /// Creates a new mutator from the specified XML element. /// </summary> private static UvmlMutator CreateMutatorForXmlElement(UltravioletContext uv, XElement parent, XElement element, Type templatedParentType, Type templatedObjectType, CultureInfo cultureInfo) { var name = element.Name.LocalName; var value = default(UvmlNode); var target = default(Object); var targetType = default(Type); var targetKind = default(UvmlMutatorTarget); var elementChildren = element.Elements().ToList(); if (elementChildren.Any() || element.IsEmpty) { targetKind = GetMutatorTarget(uv, element.Name.LocalName, null, templatedObjectType, out target, out targetType); if (typeof(FrameworkTemplate).IsAssignableFrom(targetType)) { if (elementChildren.Count() > 1) { throw new UvmlException(PresentationStrings.InvalidChildElements.Format(name)); } var frameworkTemplateElement = elementChildren.Single(); var frameworkTemplateType = default(Type); if (!uv.GetUI().GetPresentationFoundation().GetKnownType(frameworkTemplateElement.Name.LocalName, out frameworkTemplateType)) { throw new UvmlException(PresentationStrings.UnrecognizedType.Format(frameworkTemplateElement.Name.LocalName)); } if (!targetType.IsAssignableFrom(frameworkTemplateType)) { throw new UvmlException(PresentationStrings.IncompatibleType.Format(targetType.Name, frameworkTemplateType.Name)); } var frameworkTemplateChildren = frameworkTemplateElement.Elements().ToList(); if (frameworkTemplateChildren.Count() > 1) { throw new UvmlException(PresentationStrings.InvalidChildElements.Format(frameworkTemplateElement.Name)); } var frameworkTemplateContent = frameworkTemplateChildren.SingleOrDefault(); value = CreateFrameworkTemplateUvmlNode(uv, frameworkTemplateType, frameworkTemplateContent, cultureInfo); } else { var itemType = default(Type); if (UvmlCollectionItemMutatorBase.IsSupportedCollectionType(targetType, out itemType)) { var items = elementChildren.Select(x => CreateTemplateFromXml(uv, x, templatedParentType, itemType, cultureInfo)).ToList(); return(CreateMutatorForCollection(uv, targetKind, target, items)); } else { if (elementChildren.Count() > 1) { throw new UvmlException(PresentationStrings.InvalidChildElements.Format(name)); } value = CreateTemplateFromXml(uv, elementChildren.Single(), templatedParentType, targetType, cultureInfo); } } } else { targetKind = GetMutatorTarget(uv, element.Name.LocalName, element.Value, templatedObjectType, out target, out targetType); value = new UvmlLiteral(element.Value, targetType, cultureInfo); } return(CreateMutatorForTarget(targetKind, templatedParentType, templatedObjectType, target, value)); }