public ElementInitializer(XamlElement element) { elementType = element.GetElementType(); namespaces = element.Namespaces; memberInitializers = CreateMemberInitializers(element); contentInitializer = CreateContentInitializer(element); nameDirectiveValue = GetNameDirectiveValue(element); nameProperty = GetNameProperty(element.GetElementType()); }
private static IElementFactory GetDeferredKeyFactory(XamlElement xamlElement) { Type elementType = xamlElement.GetElementType(); IDeferredValueKeyProvider provider = DeferredValueKeyProviders.GetDeferredValueKeyProvider(elementType); if (provider != null) { return(new DeferredKeyFactory(provider, xamlElement)); } string keyPropertyName = DictionaryKeyPropertyAttribute.GetPropertyName(elementType); if (!keyPropertyName.IsNullOrWhiteSpace()) { XamlMember keyMember = xamlElement.Members.FirstOrDefault(member => member.Name.LocalName == keyPropertyName); if (keyMember != null) { IPropertyAdapter keyProperty = PropertyAdapter.CreateAdapter(elementType, keyPropertyName); return(ElementFactory.FromValue(keyMember.Values.Single(), keyProperty.PropertyType, xamlElement.Namespaces, xamlElement.SourceUri)); } } return(null); }
private static IElementFactory FromXamlElementContent(XamlElement element) { if (element.Members.Any()) { throw new Granular.Exception("Element \"{0}\" can't have members, as it's not a collection type and does not declare ContentProperty and can only be converted from its content", element.Name); } if (element.Values.Count() > 1) { throw new Granular.Exception("Element \"{0}\" can't have multiple children, as it's not a collection type and does not declare ContentProperty and can only be converted from its content", element.Name); } return(FromValue(element.Values.First(), element.GetElementType(), element.Namespaces, element.SourceUri)); }
public static IElementFactory FromXamlElement(XamlElement element, Type targetType) { Type elementType = element.GetElementType(); if (element.Values.Any() && ContentPropertyAttribute.GetPropertyName(elementType).IsNullOrEmpty() && !ElementCollectionContentInitailizer.IsCollectionType(elementType)) { return(FromElementFactory(FromXamlElementContent(element), targetType, element.Namespaces, element.SourceUri)); } IElementInitializer elementInitializer = new ElementInitializer(element); IElementFactory elementFactory = new ElementFactory(elementType, elementInitializer); return(FromElementFactory(elementFactory, targetType, element.Namespaces, element.SourceUri)); }
public static IElementFactory FromXamlElement(XamlElement element, Type targetType) { Type elementType = element.GetElementType(); if (elementType.GetDefaultConstructor() == null) { return(FromElementFactory(FromXamlElementContent(element), targetType, element.Namespaces)); } IElementInitializer elementInitializer = new ElementInitializer(element); IElementFactory elementFactory = new ElementFactory(elementType, elementInitializer); return(FromElementFactory(elementFactory, targetType, element.Namespaces)); }
private static IElementInitializer CreateContentInitializer(XamlElement element) { Type elementType = element.GetElementType(); string contentPropertyName = PropertyAttribute.GetPropertyName <ContentPropertyAttribute>(elementType); if (!contentPropertyName.IsNullOrEmpty()) { return(ElementMemberInitializer.Create(new XamlName(contentPropertyName), elementType, element.Values, element.Namespaces)); } if (ElementCollectionContentInitailizer.IsCollectionType(elementType)) { return(ElementCollectionContentInitailizer.Create(element.Values, elementType)); } return(null); }
private static IEnumerable <IElementInitializer> CreateMemberInitializers(XamlElement element) { Type elementType = element.GetElementType(); List <IElementInitializer> list = new List <IElementInitializer>(); int index = 0; foreach (XamlMember member in element.Members) { // markup extensions may contain members with an empty name, the name should be resolved from the member index XamlName memberName = member.Name.IsEmpty ? GetParameterName(elementType, index) : member.Name; list.Add(ElementMemberInitializer.Create(memberName, elementType, member.Values, member.Namespaces)); index++; } return(list); }
private static IElementFactory FromXamlElementContent(XamlElement element) { if (element.Members.Any()) { throw new Granular.Exception("Element \"{0}\" can't have members, as its type doesn't have a default constructor and it can only be converted from its content", element.Name); } if (!element.Values.Any()) { throw new Granular.Exception("Element \"{0}\" must have a value, as its type doesn't have a default constructor and it can only be converted from its content", element.Name); } if (element.Values.Count() > 1) { throw new Granular.Exception("Element \"{0}\" can't have multiple children, as its type doesn't have a default constructor and it can only be converted from its content", element.Name); } return(FromValue(element.Values.First(), element.GetElementType(), element.Namespaces)); }