예제 #1
0
        private void RegisterProperty(ElementAttributeMetadata metadata, String value)
        {
            var property = metadata.XName;

            if (_smartProperties.ContainsKey(property))
            {
                throw new ElementException(ElementErrorCodes.PropertyAlreadyRegistered, property);
            }

            var propertyInfo = RuntimeType.GetProperty(metadata.MemberInfo.Name);

            if (value.StartsWith("{") && value.EndsWith("}"))
            {
                var cmd         = value.Trim("{} ".ToCharArray());
                var pair        = cmd.Split(" ".ToCharArray(), 2);
                var keyword     = pair[0];
                var instruccion = pair.GetLength(0) > 1 ? pair[1] : String.Empty;

                var extension = MetadataDirectory.GetCustomMarkupExtensions(keyword);
                if (extension == null)
                {
                    throw new ElementException(ElementErrorCodes.CustomMarkupExtensionNotFound, keyword);
                }

                var @object = extension.ProvideValue(this, metadata, keyword, instruccion);
                _smartProperties.Add(property, new SmartProperty(@object));
                return;
            }

            _smartProperties.Add(property, new SmartProperty(Cast(value, propertyInfo.PropertyType)));
        }
예제 #2
0
        private void SetValue(ElementAttributeMetadata attribute, Object value)
        {
            if (attribute.IsReadOnly && !Application.IsResolvingDependencies)
            {
                throw new ElementException(ElementErrorCodes.InvalidOperation, "SetValue (" + attribute.ToString(true) + ") no puede llamarse, esta definido IsReadOnly=true.");
            }

            switch (attribute.MemberInfo.MemberType)
            {
            case MemberTypes.Field:
                var field = RuntimeType.GetField(attribute.MemberInfo.Name);
                field.SetValue(this, Cast(value, field.FieldType));
                break;

            case MemberTypes.Property:
                var property = RuntimeType.GetProperty(attribute.MemberInfo.Name);
                if (property.GetSetMethod(true) != null)
                {
                    property.SetValue(this, Cast(value, property.PropertyType), null);
                }
                break;

            default:
                throw new ElementException(ElementErrorCodes.InvalidOperation, "SetValue (" + attribute.ToString(true) + ") solo puede llamarse sobre miembros del tipo Field o Property.");
            }
        }
예제 #3
0
 public object ProvideValue(FrameworkElement frameworkElement, ElementAttributeMetadata attributeMetadata, string keyword, string content)
 {
     return(frameworkElement.Application.GetFrameworkElement(content));
 }
예제 #4
0
 public object ProvideValue(FrameworkElement frameworkElement, ElementAttributeMetadata attributeMetadata, string keyword, string content)
 {
     return(attributeMetadata.DefaultValue);
 }