protected virtual MvxChainedSourceBinding CreateChainedBinding(object source, MvxPropertyToken propertyToken,
                                                                       List<MvxPropertyToken> remainingTokens)
        {
            var indexPropertyToken = propertyToken as MvxIndexerPropertyToken;
            if (indexPropertyToken != null)
            {
                var itemPropertyInfo = this.FindPropertyInfo(source);
                if (itemPropertyInfo == null)
                    return null;

                return new MvxIndexerChainedSourceBinding(source, itemPropertyInfo, indexPropertyToken,
                                                          remainingTokens);
            }

            var propertyNameToken = propertyToken as MvxPropertyNamePropertyToken;
            if (propertyNameToken != null)
            {
                var propertyInfo = this.FindPropertyInfo(source, propertyNameToken.PropertyName);

                if (propertyInfo == null)
                    return null;

                return new MvxSimpleChainedSourceBinding(source, propertyInfo,
                                                         remainingTokens);
            }

            throw new MvxException("Unexpected property chaining - seen token type {0}",
                                   propertyToken.GetType().FullName);
        }
        public bool TryCreateBinding(object source, MvxPropertyToken currentToken,
                                     List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            if (source == null)
            {
                result = null;
                return(false);
            }

            var propertyNameToken = currentToken as MvxPropertyNamePropertyToken;

            if (propertyNameToken == null)
            {
                result = null;
                return(false);
            }

            var fieldInfo = FindFieldInfo(source, propertyNameToken.PropertyName);

            if (fieldInfo == null)
            {
                result = null;
                return(false);
            }

            if (typeof(INotifyChange).IsAssignableFrom(fieldInfo.FieldType))
            {
                return(TryCreateNotifyChangeBinding(source, remainingTokens, out result, fieldInfo, propertyNameToken));
            }

            return(TryCreateFieldInfoBinding(source, remainingTokens, out result, fieldInfo));
        }
        protected virtual IMvxSourceBinding CreateLeafBinding(object source, MvxPropertyToken propertyToken)
        {
            var indexPropertyToken = propertyToken as MvxIndexerPropertyToken;
            if (indexPropertyToken != null)
            {
                var itemPropertyInfo = this.FindPropertyInfo(source);
                if (itemPropertyInfo == null)
                    return null;
                return new MvxIndexerLeafPropertyInfoSourceBinding(source, itemPropertyInfo, indexPropertyToken);
            }

            var propertyNameToken = propertyToken as MvxPropertyNamePropertyToken;
            if (propertyNameToken != null)
            {
                var propertyInfo = this.FindPropertyInfo(source, propertyNameToken.PropertyName);
                if (propertyInfo == null)
                    return null;
                return new MvxSimpleLeafPropertyInfoSourceBinding(source, propertyInfo);
            }

            if (propertyToken is MvxEmptyPropertyToken)
            {
                return new MvxDirectToSourceBinding(source);
            }

            throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName);
        }
예제 #4
0
        protected virtual IMvxSourceBinding CreateLeafBinding(object source, MvxPropertyToken propertyToken)
        {
            var indexPropertyToken = propertyToken as MvxIndexerPropertyToken;

            if (indexPropertyToken != null)
            {
                var itemPropertyInfo = FindPropertyInfo(source);
                if (itemPropertyInfo == null)
                {
                    return(null);
                }
                return(new MvxIndexerLeafPropertyInfoSourceBinding(source, itemPropertyInfo, indexPropertyToken));
            }

            var propertyNameToken = propertyToken as MvxPropertyNamePropertyToken;

            if (propertyNameToken != null)
            {
                var propertyInfo = FindPropertyInfo(source, propertyNameToken.PropertyName);
                if (propertyInfo == null)
                {
                    return(null);
                }
                return(new MvxSimpleLeafPropertyInfoSourceBinding(source, propertyInfo));
            }

            if (propertyToken is MvxEmptyPropertyToken)
            {
                return(new MvxDirectToSourceBinding(source));
            }

            throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName);
        }
        public bool TryCreateBinding(object source, MvxPropertyToken currentToken,
                                     List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            if (source == null)
            {
                result = null;
                return false;
            }

            var propertyNameToken = currentToken as MvxPropertyNamePropertyToken;
            if (propertyNameToken == null)
            {
                result = null;
                return false;
            }

            var fieldInfo = FindFieldInfo(source, propertyNameToken.PropertyName);

            if (fieldInfo == null)
            {
                result = null;
                return false;
            }

            if (typeof (INotifyChange).IsAssignableFrom(fieldInfo.FieldType))
            {
                return TryCreateNotifyChangeBinding(source, remainingTokens, out result, fieldInfo, propertyNameToken);
            }

            return TryCreateFieldInfoBinding(source, remainingTokens, out result, fieldInfo);
        }
예제 #6
0
        public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            if (source == null)
            {
                result = null;
                return(false);
            }

            result = remainingTokens.Count == 0 ? CreateLeafBinding(source, currentToken) : CreateChainedBinding(source, currentToken, remainingTokens);
            return(result != null);
        }
        public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            if (source == null)
            {
                result = null;
                return false;
            }

            result = remainingTokens.Count == 0 ? this.CreateLeafBinding(source, currentToken) : this.CreateChainedBinding(source, currentToken, remainingTokens);
            return result != null;
        }
예제 #8
0
        protected bool TryCreateBindingFromExtensions(object source, MvxPropertyToken propertyToken,
                                                      List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            foreach (var extension in _extensions)
            {
                if (extension.TryCreateBinding(source, propertyToken, remainingTokens, out result))
                {
                    return(true);
                }
            }

            result = null;
            return(false);
        }
        protected bool TryCreateBindingFromExtensions(object source, MvxPropertyToken propertyToken,
                                            List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            foreach (var extension in _extensions)
            {
                if (extension.TryCreateBinding(source, propertyToken, remainingTokens, out result))
                {
                    return true;
                }
            }

            result = null;
            return false;
        }
        private static MvxChainedSourceBinding CreateChainedBinding(object source, MvxPropertyToken propertyToken,
                                                                    List<MvxPropertyToken> remainingTokens)
        {
            if (propertyToken is MvxIndexerPropertyToken)
            {
                return new MvxIndexerChainedSourceBinding(source, (MvxIndexerPropertyToken) propertyToken,
                                                          remainingTokens);
            }
            else if (propertyToken is MvxPropertyNamePropertyToken)
            {
                return new MvxSimpleChainedSourceBinding(source, (MvxPropertyNamePropertyToken) propertyToken,
                                                         remainingTokens);
            }

            throw new MvxException("Unexpected property chaining - seen token type {0}",
                                   propertyToken.GetType().FullName);
        }
        private static MvxChainedSourceBinding CreateChainedBinding(object source, MvxPropertyToken propertyToken,
                                                                    List <MvxPropertyToken> remainingTokens)
        {
            if (propertyToken is MvxIndexerPropertyToken)
            {
                return(new MvxIndexerChainedSourceBinding(source, (MvxIndexerPropertyToken)propertyToken,
                                                          remainingTokens));
            }
            else if (propertyToken is MvxPropertyNamePropertyToken)
            {
                return(new MvxSimpleChainedSourceBinding(source, (MvxPropertyNamePropertyToken)propertyToken,
                                                         remainingTokens));
            }

            throw new MvxException("Unexpected property chaining - seen token type {0}",
                                   propertyToken.GetType().FullName);
        }
        private static IMvxSourceBinding CreateLeafBinding(object source, MvxPropertyToken propertyToken)
        {
            if (propertyToken is MvxIndexerPropertyToken)
            {
                return new MvxIndexerLeafPropertyInfoSourceBinding(source, (MvxIndexerPropertyToken) propertyToken);
            }
            else if (propertyToken is MvxPropertyNamePropertyToken)
            {
                return new MvxSimpleLeafPropertyInfoSourceBinding(source, (MvxPropertyNamePropertyToken) propertyToken);
            }
            else if (propertyToken is MvxEmptyPropertyToken)
            {
                return new MvxDirectToSourceBinding(source);
            }

            throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName);
        }
        private static IMvxSourceBinding CreateLeafBinding(object source, MvxPropertyToken propertyToken)
        {
            if (propertyToken is MvxIndexerPropertyToken)
            {
                return(new MvxIndexerLeafPropertyInfoSourceBinding(source, (MvxIndexerPropertyToken)propertyToken));
            }
            else if (propertyToken is MvxPropertyNamePropertyToken)
            {
                return(new MvxSimpleLeafPropertyInfoSourceBinding(source, (MvxPropertyNamePropertyToken)propertyToken));
            }
            else if (propertyToken is MvxEmptyPropertyToken)
            {
                return(new MvxDirectToSourceBinding(source));
            }

            throw new MvxException("Unexpected property source - seen token type {0}", propertyToken.GetType().FullName);
        }
        public bool TryCreateBinding(object source, MvxPropertyToken propertyToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            var observable = source as IObservable<object>;

            if (observable != null)
            {
                var list = new List<MvxPropertyToken>();

                if (!(propertyToken is MvxEmptyPropertyToken))
                    list.Add(propertyToken);

                list.AddRange(remainingTokens);

                result = new ObservableMvxSourceBinding(observable, list);
                return true;
            }

            result = null;
            return false;
        }
예제 #15
0
        public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            if (source == null)
            {
                result = null;
                return(false);
            }

            if (remainingTokens.Count > 0)
            {
                result = null;
                return(false);
            }

            var propertyNameToken = currentToken as MvxPropertyNamePropertyToken;

            if (propertyNameToken == null)
            {
                result = null;
                return(false);
            }

            var methodInfo = FindMethodInfo(source, propertyNameToken.PropertyName);

            if (methodInfo == null)
            {
                result = null;
                return(false);
            }

            var parameters = methodInfo.GetParameters();

            if (parameters.Count(p => !p.IsOptional) > 1)
            {
                MvxPluginLog.Instance?.Log(LogLevel.Warning,
                                           "Problem binding to Method {0} - too many non-optional parameters");
            }

            result = new MvxMethodSourceBinding(source, methodInfo);
            return(true);
        }
        public bool TryCreateBinding(object source, MvxPropertyToken currentToken, List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            if (source == null)
            {
                result = null;
                return false;
            }

            if (remainingTokens.Count > 0)
            {
                result = null;
                return false;
            }

            var propertyNameToken = currentToken as MvxPropertyNamePropertyToken;
            if (propertyNameToken == null)
            {
                result = null;
                return false;
            }

            var methodInfo = FindMethodInfo(source, propertyNameToken.PropertyName);

            if (methodInfo == null)
            {
                result = null;
                return false;
            }

            var parameters = methodInfo.GetParameters();
            if (parameters.Count(p => !p.IsOptional) > 1)
            {
                MvxBindingTrace.Warning("Problem binding to Method {0} - too many non-optional parameters");
            }

            result = new MvxMethodSourceBinding(source, methodInfo);
            return true;
        }
        public bool TryCreateBinding(object source, MvxPropertyToken currentToken,
                                     List <MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            if (source != null)
            {
                Type bindingSourceType    = null;
                Type bindingTypeParameter = null;

                if (currentToken is MvxEmptyPropertyToken)
                {
                    var observable = source as IObservable <object>;
                    if (observable != null)
                    {
                        result = new ObservableMvxSourceBinding <object>(observable, typeof(object), this._mainThreadDispatcher, remainingTokens);
                        return(true);
                    }

                    var implementedInterface = source
                                               .GetType()
                                               .GetTypeInfo()
                                               .ImplementedInterfaces
                                               .FirstOrDefault(iface => ((iface.IsConstructedGenericType) && (iface.GetGenericTypeDefinition() == typeof(IObservable <>))));

                    if (implementedInterface != null)
                    {
                        bindingSourceType = bindingTypeParameter = implementedInterface.GenericTypeArguments[0];
                    }
                }
                else
                {
                    var propertyNameToken = currentToken as MvxPropertyNamePropertyToken;
                    if (propertyNameToken != null)
                    {
                        var propertyInfo = this.FindPropertyInfo(source, propertyNameToken.PropertyName);
                        if (propertyInfo != null)
                        {
                            var propertyTypeInfo = propertyInfo.PropertyType.GetTypeInfo();
                            if ((propertyTypeInfo.IsGenericType) && (propertyTypeInfo.GetGenericTypeDefinition() == typeof(IObservable <>)))
                            {
                                source = propertyInfo.GetValue(source, ObservableMvxPropertySourceBindingFactoryExtension.EmptyObjectArray);

                                if (source != null)
                                {
                                    bindingSourceType    = propertyTypeInfo.GenericTypeArguments[0];
                                    bindingTypeParameter = (bindingSourceType.GetTypeInfo().IsValueType)
                                        ? bindingSourceType
                                        : typeof(object);
                                }
                            }
                        }
                    }
                }

                if (bindingTypeParameter != null)
                {
                    result = (IMvxSourceBinding)Activator.CreateInstance(
                        typeof(ObservableMvxSourceBinding <>).MakeGenericType(bindingTypeParameter),
                        source,
                        bindingSourceType,
                        this._mainThreadDispatcher,
                        remainingTokens);

                    return(true);
                }
            }

            result = null;
            return(false);
        }
        public bool TryCreateBinding(object source, MvxPropertyToken currentToken,
                                     List<MvxPropertyToken> remainingTokens, out IMvxSourceBinding result)
        {
            if (source != null)
            {
                Type bindingSourceType = null;
                Type bindingTypeParameter = null;

                if (currentToken is MvxEmptyPropertyToken)
                {
                    var observable = source as IObservable<object>;
                    if (observable != null)
                    {
                        result = new ObservableMvxSourceBinding<object>(observable, typeof(object), this._mainThreadDispatcher, remainingTokens);
                        return true;
                    }

                    var implementedInterface = source
                        .GetType()
                        .GetTypeInfo()
                        .ImplementedInterfaces
                        .FirstOrDefault(iface => ((iface.IsConstructedGenericType) && (iface.GetGenericTypeDefinition() == typeof(IObservable<>))));
                       
                    if (implementedInterface != null)
                        bindingSourceType = bindingTypeParameter = implementedInterface.GenericTypeArguments[0];
                }
                else
                {
                    var propertyNameToken = currentToken as MvxPropertyNamePropertyToken;
                    if (propertyNameToken != null)
                    {
                        var propertyInfo = this.FindPropertyInfo(source, propertyNameToken.PropertyName);
                        if (propertyInfo != null)
                        {
                            var propertyTypeInfo = propertyInfo.PropertyType.GetTypeInfo();
                            if ((propertyTypeInfo.IsGenericType) && (propertyTypeInfo.GetGenericTypeDefinition() == typeof(IObservable<>)))
                            {
                                source = propertyInfo.GetValue(source, ObservableMvxPropertySourceBindingFactoryExtension.EmptyObjectArray);

                                if (source != null)
                                {
                                    bindingSourceType = propertyTypeInfo.GenericTypeArguments[0];
                                    bindingTypeParameter = (bindingSourceType.GetTypeInfo().IsValueType)
                                        ? bindingSourceType
                                        : typeof(object);
                                }
                            }
                        }
                    }
                }

                if (bindingTypeParameter != null)
                {
                    result = (IMvxSourceBinding)Activator.CreateInstance(
                        typeof(ObservableMvxSourceBinding<>).MakeGenericType(bindingTypeParameter),
                        source,
                        bindingSourceType,
                        this._mainThreadDispatcher,
                        remainingTokens);

                    return true;
                }
            }

            result = null;
            return false;
        }
 private static void AssertIsSimplePropertyToken(MvxPropertyToken token, string text)
 {
     Assert.IsInstanceOf <MvxPropertyNamePropertyToken>(token);
     Assert.AreEqual(text, ((MvxPropertyNamePropertyToken)token).PropertyName);
 }
 private static void AssertIsIndexerPropertyToken <T, TSpecific>(MvxPropertyToken token, T value)
 {
     Assert.IsInstanceOf <MvxIndexerPropertyToken <T> >(token);
     Assert.IsInstanceOf <TSpecific>(token);
     Assert.AreEqual(value, ((MvxIndexerPropertyToken <T>)token).Key);
 }
예제 #21
0
        protected virtual MvxChainedSourceBinding CreateChainedBinding(object source, MvxPropertyToken propertyToken,
                                                                       List <MvxPropertyToken> remainingTokens)
        {
            var indexPropertyToken = propertyToken as MvxIndexerPropertyToken;

            if (indexPropertyToken != null)
            {
                var itemPropertyInfo = FindPropertyInfo(source);
                if (itemPropertyInfo == null)
                {
                    return(null);
                }

                return(new MvxIndexerChainedSourceBinding(source, itemPropertyInfo, indexPropertyToken,
                                                          remainingTokens));
            }

            var propertyNameToken = propertyToken as MvxPropertyNamePropertyToken;

            if (propertyNameToken != null)
            {
                var propertyInfo = FindPropertyInfo(source, propertyNameToken.PropertyName);

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

                return(new MvxSimpleChainedSourceBinding(source, propertyInfo,
                                                         remainingTokens));
            }

            throw new MvxException("Unexpected property chaining - seen token type {0}",
                                   propertyToken.GetType().FullName);
        }
예제 #22
0
 private static void AssertIsSimplePropertyToken(MvxPropertyToken token, string text)
 {
     Assert.IsAssignableFrom <MvxPropertyNamePropertyToken>(token);
     Assert.Equal(text, ((MvxPropertyNamePropertyToken)token).PropertyName);
 }
예제 #23
0
 private static void AssertIsIndexerPropertyToken <T, TSpecific>(MvxPropertyToken token, T value)
 {
     Assert.IsAssignableFrom <MvxIndexerPropertyToken <T> >(token);
     Assert.IsAssignableFrom <TSpecific>(token);
     Assert.Equal(value, ((MvxIndexerPropertyToken <T>)token).Key);
 }