示例#1
0
        public static void SetValue(object instance, MutableMember member, object value)
        {
            var perspexProperty = FindPerspexProperty(instance, member);

            if (value is IBinding)
            {
                SetBinding(instance, member, perspexProperty, (IBinding)value);
            }
            else if (perspexProperty != null)
            {
                ((PerspexObject)instance).SetValue(perspexProperty, value);
            }
            else if (instance is Setter && member.Name == "Value")
            {
                // TODO: Make this more generic somehow.
                var setter        = (Setter)instance;
                var targetType    = setter.Property.PropertyType;
                var valuePipeline = new ValuePipeline(member.TypeRepository, null);
                var xamlType      = member.TypeRepository.GetByType(targetType);
                SetClrProperty(instance, member, valuePipeline.ConvertValueIfNecessary(value, xamlType));
            }
            else
            {
                SetClrProperty(instance, member, value);
            }
        }
示例#2
0
        private static PerspexProperty FindPerspexProperty(object instance, MutableMember member)
        {
            var target   = instance as IPerspexObject;
            var attached = member as PerspexAttachableXamlMember;

            if (target == null)
            {
                return(null);
            }

            PerspexProperty property;
            string          propertyName;

            if (attached == null)
            {
                propertyName = member.Name;
                property     = PerspexPropertyRegistry.Instance.GetRegistered((PerspexObject)target)
                               .FirstOrDefault(x => x.Name == propertyName);
            }
            else
            {
                // Ensure the OwnerType's static ctor has been run.
                RuntimeHelpers.RunClassConstructor(attached.DeclaringType.UnderlyingType.TypeHandle);

                propertyName = attached.DeclaringType.UnderlyingType.Name + '.' + member.Name;

                property = PerspexPropertyRegistry.Instance.GetRegistered((PerspexObject)target)
                           .Where(x => x.IsAttached && x.OwnerType == attached.DeclaringType.UnderlyingType)
                           .FirstOrDefault(x => x.Name == member.Name);
            }

            return(property);
        }
示例#3
0
        public static void SetValue(
            object instance, 
            MutableMember member, 
            object value,
            IValueContext context)
        {
            var perspexProperty = FindPerspexProperty(instance, member);

            if (value is IBinding)
            {
                SetBinding(instance, member, perspexProperty, (IBinding)value);
            }
            else if (perspexProperty != null)
            {
                ((PerspexObject)instance).SetValue(perspexProperty, value);
            }
            else if (instance is Setter && member.Name == "Value")
            {
                // TODO: Make this more generic somehow.
                var setter = (Setter)instance;
                var targetType = setter.Property.PropertyType;
                var xamlType = member.TypeRepository.GetByType(targetType);
                var convertedValue = default(object);

                if (CommonValueConversion.TryConvert(value, xamlType, context, out convertedValue))
                {
                    SetClrProperty(instance, member, convertedValue);
                }
            }
            else
            {
                SetClrProperty(instance, member, value);
            }
        }
示例#4
0
        public static void SetValue(
            object instance,
            MutableMember member,
            object value,
            IValueContext context)
        {
            var perspexProperty = FindPerspexProperty(instance, member);

            if (value is IBinding)
            {
                SetBinding(instance, member, perspexProperty, context, (IBinding)value);
            }
            else if (perspexProperty != null)
            {
                ((PerspexObject)instance).SetValue(perspexProperty, value);
            }
            else if (instance is Setter && member.Name == "Value")
            {
                // TODO: Make this more generic somehow.
                var setter         = (Setter)instance;
                var targetType     = setter.Property.PropertyType;
                var xamlType       = member.TypeRepository.GetByType(targetType);
                var convertedValue = default(object);

                if (CommonValueConversion.TryConvert(value, xamlType, context, out convertedValue))
                {
                    SetClrProperty(instance, member, convertedValue);
                }
            }
            else
            {
                SetClrProperty(instance, member, value);
            }
        }
示例#5
0
        public static void SetValue(object instance, MutableMember member, object value)
        {
            var perspexProperty = FindPerspexProperty(instance, member);

            if (value is IBinding)
            {
                SetBinding(instance, member, perspexProperty, (IBinding)value);
            }
            else if (perspexProperty != null)
            {
                ((PerspexObject)instance).SetValue(perspexProperty, value);
            }
            else if (instance is Setter && member.Name == "Value")
            {
                // TODO: Make this more generic somehow.
                var setter = (Setter)instance;
                var targetType = setter.Property.PropertyType;
                var valuePipeline = new ValuePipeline(member.TypeRepository, null);
                var xamlType = member.TypeRepository.GetByType(targetType);
                SetClrProperty(instance, member, valuePipeline.ConvertValueIfNecessary(value, xamlType));
            }
            else
            {
                SetClrProperty(instance, member, value);
            }
        }
示例#6
0
        private static PerspexProperty FindPerspexProperty(object instance, MutableMember member)
        {
            var registry = PerspexPropertyRegistry.Instance;
            var attached = member as PerspexAttachableXamlMember;
            var target   = instance as PerspexObject;

            if (target == null)
            {
                return(null);
            }

            if (attached == null)
            {
                return(registry.FindRegistered(target, member.Name));
            }
            else
            {
                var ownerType = attached.DeclaringType.UnderlyingType;

                RuntimeHelpers.RunClassConstructor(ownerType.TypeHandle);

                return(registry.GetRegistered(target)
                       .Where(x => x.OwnerType == ownerType && x.Name == attached.Name)
                       .FirstOrDefault());
            }
        }
示例#7
0
        private static PerspexProperty FindPerspexProperty(object instance, MutableMember member)
        {
            var target = instance as IPerspexObject;
            var attached = member as PerspexAttachableXamlMember;

            if (target == null)
            {
                return null;
            }

            PerspexProperty property;
            string propertyName;

            if (attached == null)
            {
                propertyName = member.Name;
                property = PerspexPropertyRegistry.Instance.GetRegistered((PerspexObject)target)
                    .FirstOrDefault(x => x.Name == propertyName);
            }
            else
            {
                // Ensure the OwnerType's static ctor has been run.
                RuntimeHelpers.RunClassConstructor(attached.DeclaringType.UnderlyingType.TypeHandle);

                propertyName = attached.DeclaringType.UnderlyingType.Name + '.' + member.Name;

                property = PerspexPropertyRegistry.Instance.GetRegistered((PerspexObject)target)
                    .Where(x => x.IsAttached && x.OwnerType == attached.DeclaringType.UnderlyingType)
                    .FirstOrDefault(x => x.Name == member.Name);
            }

            return property;
        }
示例#8
0
        private static AvaloniaProperty FindAvaloniaProperty(object instance, MutableMember member)
        {
            var registry = AvaloniaPropertyRegistry.Instance;
            var attached = member as AvaloniaAttachableXamlMember;
            var target = instance as AvaloniaObject;

            if (target == null)
            {
                return null;
            }

            if (attached == null)
            {
                return registry.FindRegistered(target, member.Name);
            }
            else
            {
                var ownerType = attached.DeclaringType.UnderlyingType;

                RuntimeHelpers.RunClassConstructor(ownerType.TypeHandle);

                return registry.GetRegistered(target)
                    .Where(x => x.OwnerType == ownerType && x.Name == attached.Name)
                    .FirstOrDefault();
            }
        }
示例#9
0
 private static void SetClrProperty(object instance, MutableMember member, object value)
 {
     if (member.IsAttachable)
     {
         member.Setter.Invoke(null, new[] { instance, value });
     }
     else
     {
         member.Setter.Invoke(instance, new[] { value });
     }
 }
示例#10
0
 private static void SetClrProperty(object instance, MutableMember member, object value)
 {
     if (member.IsAttachable)
     {
         member.Setter.Invoke(null, new[] { instance, value });
     }
     else
     {
         member.Setter.Invoke(instance, new[] { value });
     }
 }
        private MutableMember GetMemberForDottedLocator(PropertyLocator propertyLocator)
        {
            var ownerName   = propertyLocator.Owner.PropertyName;
            var ownerPrefix = propertyLocator.Owner.Prefix;

            var owner = typeSource.GetByPrefix(ownerPrefix, ownerName);

            MutableMember member = owner.GetAttachableMember(propertyLocator.PropertyName);

            return(member);
        }
示例#12
0
 private static void SetBinding(
     object instance,
     MutableMember member,
     PerspexProperty property,
     IBinding binding)
 {
     if (!(AssignBinding(instance, member, binding) || ApplyBinding(instance, property, binding)))
     {
         throw new InvalidOperationException(
                   $"Cannot assign to '{member.Name}' on '{instance.GetType()}");
     }
 }
示例#13
0
 private static void SetBinding(
     object instance,
     MutableMember member, 
     PerspexProperty property, 
     IBinding binding)
 {
     if (!(AssignBinding(instance, member, binding) || ApplyBinding(instance, property, binding)))
     {
         throw new InvalidOperationException(
             $"Cannot assign to '{member.Name}' on '{instance.GetType()}");
     }
 }
示例#14
0
        private static bool AssignBinding(object instance, MutableMember member, IBinding binding)
        {
            var property = instance.GetType()
                .GetRuntimeProperties()
                .FirstOrDefault(x => x.Name == member.Name);

            if (property?.GetCustomAttribute<AssignBindingAttribute>() != null)
            {
                property.SetValue(instance, binding);
                return true;
            }

            return false;
        }
示例#15
0
        private static bool AssignBinding(object instance, MutableMember member, IBinding binding)
        {
            var property = instance.GetType()
                           .GetRuntimeProperties()
                           .FirstOrDefault(x => x.Name == member.Name);

            if (property?.GetCustomAttribute <AssignBindingAttribute>() != null)
            {
                property.SetValue(instance, binding);
                return(true);
            }

            return(false);
        }
        private bool TryGetDeferredAssembler(MutableMember member, out IDeferredLoader loader)
        {
            Guard.ThrowIfNull(member, nameof(member));

            var propInfo = member.DeclaringType.UnderlyingType.GetRuntimeProperty(member.Name);
            if  (propInfo!=null)
            {
                var success = mapping.TryGetMapping(propInfo, out loader);
                return success;
            }

            loader = null;
            return false;
        }
示例#17
0
        private static XamlMember GetMember(MutableMember member, XamlSchemaContext context)
        {
            var declaringType = ToWpf(member.DeclaringType, context);

            if (!member.IsAttachable)
            {
                var xamlMember = declaringType.GetMember(member.Name);
                return(new XamlMemberAdapter(xamlMember, context));
            }
            else
            {
                var xamlMember = declaringType.GetAttachableMember(member.Name);
                return(new XamlMemberAdapter(xamlMember, context, member.Name, xamlMember.Invoker.UnderlyingGetter, xamlMember.Invoker.UnderlyingSetter));
            }
        }
示例#18
0
        private bool TryGetDeferredAssembler(MutableMember member, out IDeferredLoader loader)
        {
            Guard.ThrowIfNull(member, nameof(member));

            var propInfo = member.DeclaringType.UnderlyingType.GetRuntimeProperty(member.Name);

            if (propInfo != null)
            {
                var success = mapping.TryGetMapping(propInfo, out loader);
                return(success);
            }

            loader = null;
            return(false);
        }
示例#19
0
        private static XamlMember GetMember(MutableMember member, XamlSchemaContext context)
        {
            var declaringType = ToWpf(member.DeclaringType, context);

            if (!member.IsAttachable)
            {
                var xamlMember = declaringType.GetMember(member.Name);
                return new XamlMemberAdapter(xamlMember, context);
            }
            else
            {
                var xamlMember = declaringType.GetAttachableMember(member.Name);
                return new XamlMemberAdapter(xamlMember, context, member.Name, xamlMember.Invoker.UnderlyingGetter, xamlMember.Invoker.UnderlyingSetter);
            }
        }
示例#20
0
        private static PerspexProperty FindPerspexProperty(object instance, MutableMember member)
        {
            var target = instance as PerspexObject;

            if (target == null)
            {
                return null;
            }

            var attached = member as PerspexAttachableXamlMember;
            var propertyName = attached == null ? 
                member.Name : 
                member.DeclaringType.Name + "." + member.Name;

            return PerspexPropertyRegistry.Instance.FindRegistered(target, propertyName);
        }
示例#21
0
        private static PerspexProperty FindPerspexProperty(object instance, MutableMember member)
        {
            var target = instance as PerspexObject;

            if (target == null)
            {
                return(null);
            }

            var attached     = member as PerspexAttachableXamlMember;
            var propertyName = attached == null ?
                               member.Name :
                               member.DeclaringType.Name + "." + member.Name;

            return(PerspexPropertyRegistry.Instance.FindRegistered(target, propertyName));
        }
 public AvaloniaMemberValuePlugin(MutableMember xamlMember) 
     : base(xamlMember)
 {
     _xamlMember = xamlMember;
 }
示例#23
0
 public PerspexMemberValuePlugin(MutableMember xamlMember)
     : base(xamlMember)
 {
     _xamlMember = xamlMember;
 }
示例#24
0
 public MemberValuePlugin(MutableMember member) : base(member)
 {
     this.member = member;
 }
示例#25
0
 public AvaloniaMemberValuePlugin(MutableMember xamlMember)
     : base(xamlMember)
 {
     _xamlMember = xamlMember;
 }
示例#26
0
        private static object GetValueTuple(object instance, MutableMember member)
        {
            var xamlMemberBase = member;

            return(xamlMemberBase.GetValue(instance));
        }
示例#27
0
 public MemberValuePlugin(MutableMember member) : base(member)
 {
     this.member = member;
 }
示例#28
0
 private static bool IsMemberEquivalentToNameDirective(MutableMember memberToCheck)
 {
     return Equals(memberToCheck, memberToCheck.DeclaringType.RuntimeNamePropertyMember);
 }
示例#29
0
 public PerspexMemberValuePlugin(MutableMember xamlMember) 
     : base(xamlMember)
 {
     _xamlMember = xamlMember;
 }
示例#30
0
 public MemberNodesBlock(Instruction headingInstruction)
 {
     member = (MutableMember)headingInstruction.Member;
 }
 public XamlSetValueEventArgs(MutableMember member, object value)
 {
     Value = value;
     Member = member;
 }
示例#32
0
 public XamlSetValueEventArgs(MutableMember member, object value)
 {
     Value  = value;
     Member = member;
 }
示例#33
0
 private static bool IsMemberEquivalentToNameDirective(MutableMember memberToCheck)
 {
     return(Equals(memberToCheck, memberToCheck.DeclaringType.RuntimeNamePropertyMember));
 }
示例#34
0
 private static object GetValueTuple(object instance, MutableMember member)
 {
     var xamlMemberBase = member;
     return xamlMemberBase.GetValue(instance);
 }