private ISection CreateMultiselectCollectionSection(MemberInfo member, string caption, object view, List <Binding> bindings)
        {
            object context = view;

            var csection = new Section()
            {
                IsMultiselect = true, Opaque = false
            };
            var index = 0;

            SetDefaultConverter(view, member, "DataContext", new EnumerableConverter(), null, bindings);

            var dataContextMember = GetMemberFromDataContext(member, ref context);

            var collection = dataContextMember.GetValue(context) as IEnumerable;

            foreach (var item in collection)
            {
                var checkboxElement = new CheckboxElement(item.ToString())
                {
                    Item = item, Index = index, DataContext = false
                };

                csection.Add(checkboxElement);
                index++;
            }

            csection.ViewBinding.DataContextCode = DataContextCode.MultiselectCollection;
            csection.ViewBinding.ViewType        = null;

            return(csection);
        }
        private ISection CreateEnumCollectionSection(MemberInfo member, string caption, object view, List <Binding> bindings)
        {
            Type memberType = GetTypeForMember(member);

            object context     = view;
            var    dataContext = view as IDataContext;

            if (dataContext != null)
            {
                context = dataContext.DataContext;
            }

            SetDefaultConverter(view, member, "DataContext", new EnumCollectionConverter(), null, bindings);

            member = GetMemberFromDataContext(member, ref context);

            var csection = new Section()
            {
                IsMultiselect = true, Opaque = false
            };

            var collection = member.GetValue(view);

            if (collection == null)
            {
                var    collectionType = typeof(EnumCollection <>);
                var    enumType       = memberType.GetGenericArguments().FirstOrDefault();
                Type[] generic        = { enumType };

                collection = Activator.CreateInstance(collectionType.MakeGenericType(generic));
                member.SetValue(view, collection);
            }

            var index = 0;
            var items = (EnumCollection)collection;

            foreach (var item in items.Items)
            {
                var checkboxElement = new CheckboxElement(item.Description)
                {
                    Item        = item,
                    Index       = index,
                    DataContext = item.IsChecked,
                    Group       = item.GroupName
                };

                csection.Add(checkboxElement);
                index++;
            }

            csection.DataContext = memberType;
            csection.ViewBinding.DataContextCode = DataContextCode.EnumCollection;

            return(csection);
        }
        public IElement CreateEnumCollectionRoot(MemberInfo member, string caption, object view, List <Binding> bindings)
        {
            Type memberType = GetTypeForMember(member);

            SetDefaultConverter(member, "Value", new EnumItemsConverter(), bindings);

            var csection = new Section()
            {
                IsMultiselect = true, Opaque = false
            };

            ApplyRootTheme(view, csection);

            var collection = GetValue(member, view);

            if (collection == null)
            {
                var    collectionType = typeof(EnumCollection <>);
                var    enumType       = memberType.GetGenericArguments()[0];
                Type[] generic        = { enumType };

                collection = Activator.CreateInstance(collectionType.MakeGenericType(generic));
                (member as PropertyInfo).SetValue(view, collection, new object[] {});
            }

            var index = 0;
            var items = (EnumCollection)collection;

            foreach (var item in items.AllValues)
            {
                var checkboxElement = new CheckboxElement(item.Description)
                {
                    Index = index, Value = item.IsChecked, Group = item.GroupName
                };
                ApplyRootTheme(view, checkboxElement);

                csection.Add(checkboxElement);

                index++;
            }

            var element = new RootElement(caption)
            {
                csection
            };

            element.ViewBinding.DataContextCode = DataContextCode.EnumCollection;

            element.Theme.CellStyle = UITableViewCellStyle.Value1;

            return(element);
        }
        private void BuildElementPropertyMap()
        {
            _ElementPropertyMap = new Dictionary <Type, Func <MemberInfo, string, object, List <Binding>, IElement> >();
            _ElementPropertyMap.Add(typeof(MethodInfo), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var buttonAttribute = member.GetCustomAttribute <ButtonAttribute>();
                if (buttonAttribute != null)
                {
                    var belement = new ButtonElement(caption)
                    {
                        Command = GetCommandForMember(view, member)
                    };

                    ((ReflectiveCommand)belement.Command).Element = belement;

                    belement.Command.CanExecuteChanged += HandleCanExecuteChanged;
                    element = belement;
                }

                var loadMoreAttribute = member.GetCustomAttribute <LoadMoreAttribute>();
                if (loadMoreAttribute != null)
                {
                    var normalCaption  = !string.IsNullOrEmpty(loadMoreAttribute.NormalCaption) ? loadMoreAttribute.NormalCaption: "Load More";
                    var loadingCaption = !string.IsNullOrEmpty(loadMoreAttribute.LoadingCaption) ? loadMoreAttribute.LoadingCaption: "Loading...";

                    element = new LoadMoreElement(normalCaption, loadingCaption, null)
                    {
                        Command = GetCommandForMember(view, member)
                    };
                }

                var enableSearchAttribute = member.GetCustomAttribute <EnableSearchAttribute>();
                var searchbar             = Root as ISearchBar;
                if (enableSearchAttribute != null && searchbar != null)
                {
                    searchbar.AutoHideSearch    = enableSearchAttribute.AutoHide;
                    searchbar.SearchPlaceholder = enableSearchAttribute.Placeholder;
                    searchbar.IncrementalSearch = enableSearchAttribute.IncrementalSearch;
                    searchbar.EnableSearch      = true;

                    var methodInfo          = member as MethodInfo;
                    searchbar.SearchCommand = new SearchCommand(view, methodInfo);
                }

                return(element);
            });

            _ElementPropertyMap.Add(typeof(CLLocationCoordinate2D), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var mapAttribute = member.GetCustomAttribute <MapAttribute>();
                var location     = (CLLocationCoordinate2D)GetValue(member, view);
                if (mapAttribute != null)
                {
                    element = new MapElement(mapAttribute.Caption, location);
                }

                return(element);
            });

            _ElementPropertyMap.Add(typeof(string), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var passwordAttribute  = member.GetCustomAttribute <PasswordAttribute>();
                var entryAttribute     = member.GetCustomAttribute <EntryAttribute>();
                var multilineAttribute = member.GetCustomAttribute <MultilineAttribute>();
                var htmlAttribute      = member.GetCustomAttribute <HtmlAttribute>();

                if (passwordAttribute != null)
                {
                    element = new EntryElement(caption)
                    {
                        Placeholder = passwordAttribute.Placeholder, KeyboardType = passwordAttribute.KeyboardType, IsPassword = true, EditMode = entryAttribute.EditMode, AutoCorrectionType = passwordAttribute.AutoCorrectionType, AutoCapitalizationType = passwordAttribute.AutoCapitalizationType
                    };
                }
                else if (entryAttribute != null)
                {
                    element = new EntryElement(caption)
                    {
                        Placeholder = entryAttribute.Placeholder, KeyboardType = entryAttribute.KeyboardType, EditMode = entryAttribute.EditMode, AutoCorrectionType = entryAttribute.AutoCorrectionType, AutoCapitalizationType = entryAttribute.AutoCapitalizationType
                    };
                }
                else if (multilineAttribute != null)
                {
                    element = new MultilineElement(caption);
                }
                else if (htmlAttribute != null)
                {
                    SetDefaultConverter(member, "Value", new UriConverter(), bindings);
                    element = new HtmlElement(caption);
                }
                else
                {
                    var selement = new StringElement(caption, (string)GetValue(member, view))
                    {
                    };

                    element = selement;
                }

                return(element);
            });

            _ElementPropertyMap.Add(typeof(float), (member, caption, view, bindings) =>
            {
                IElement element   = null;
                var rangeAttribute = member.GetCustomAttribute <RangeAttribute>();
                if (rangeAttribute != null)
                {
                    var floatElement = new FloatElement(caption)
                    {
                        ShowCaption = rangeAttribute.ShowCaption, MinValue = rangeAttribute.Low, MaxValue = rangeAttribute.High, Value = rangeAttribute.Low
                    };
                    element = floatElement;
                }
                else
                {
                    var entryAttribute = member.GetCustomAttribute <EntryAttribute>();
                    string placeholder = null;
                    var keyboardType   = UIKeyboardType.NumberPad;

                    if (entryAttribute != null)
                    {
                        placeholder = entryAttribute.Placeholder;
                        if (entryAttribute.KeyboardType != UIKeyboardType.Default)
                        {
                            keyboardType = entryAttribute.KeyboardType;
                        }
                    }

                    element = new EntryElement(caption)
                    {
                        Placeholder = placeholder, KeyboardType = keyboardType
                    };
                }

                return(element);
            });

            _ElementPropertyMap.Add(typeof(Uri), (member, caption, view, bindings) =>
            {
                return(new HtmlElement(caption, (Uri)GetValue(member, view)));
            });

            _ElementPropertyMap.Add(typeof(bool), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var checkboxAttribute = member.GetCustomAttribute <CheckboxAttribute>();
                if (checkboxAttribute != null)
                {
                    element = new CheckboxElement(caption)
                    {
                    }
                }
                ;
                else
                {
                    element = new BooleanElement(caption)
                    {
                    }
                };

                return(element);
            });

            _ElementPropertyMap.Add(typeof(DateTime), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var dateAttribute = member.GetCustomAttribute <DateAttribute>();
                var timeAttribute = member.GetCustomAttribute <TimeAttribute>();

                if (dateAttribute != null)
                {
                    element = new DateElement(caption)
                    {
                        Value = (DateTime)GetValue(member, view)
                    }
                }
                ;
                else if (timeAttribute != null)
                {
                    element = new TimeElement(caption)
                    {
                        Value = (DateTime)GetValue(member, view)
                    }
                }
                ;
                else
                {
                    element = new DateTimeElement(caption)
                    {
                        Value = (DateTime)GetValue(member, view)
                    }
                };

                return(element);
            });

            _ElementPropertyMap.Add(typeof(UIImage), (member, caption, view, bindings) =>
            {
                return(new ImageElement());
            });

            _ElementPropertyMap.Add(typeof(int), (member, caption, view, bindings) =>
            {
                SetDefaultConverter(member, "Value", new IntConverter(), bindings);
                return(new StringElement(caption)
                {
                    Value = GetValue(member, view).ToString()
                });
            });
        }
		private void BuildElementPropertyMap()
		{
			_ElementPropertyMap = new Dictionary<Type, Func<MemberInfo, string, object, List<Binding>, IElement>>();
			_ElementPropertyMap.Add(typeof(MethodInfo), (member, caption, view, bindings)=>
			{
				IElement element = null;
				
				var loadMoreAttribute = member.GetCustomAttribute<LoadMoreAttribute>();
				if (loadMoreAttribute != null)
				{
					var normalCaption = !string.IsNullOrEmpty(loadMoreAttribute.NormalCaption) ? loadMoreAttribute.NormalCaption: "Load More";
					var loadingCaption =  !string.IsNullOrEmpty(loadMoreAttribute.LoadingCaption) ? loadMoreAttribute.LoadingCaption: "Loading...";

					element = new LoadMoreElement(normalCaption, loadingCaption, null) { Command = GetCommandForMember(view, member) };
				}

				var searchbarAttribute = member.GetCustomAttribute<SearchbarAttribute>();
				var searchbar = Root as ISearchBar;
				if (searchbarAttribute != null && searchbar != null)
				{
					searchbar.SearchPlaceholder = searchbarAttribute.Placeholder;
					searchbar.IncrementalSearch = searchbarAttribute.IncrementalSearch;
					searchbar.EnableSearch = true;
					searchbar.IsSearchbarHidden = false;
					
					var methodInfo = member as MethodInfo;
					searchbar.SearchCommand = new SearchCommand(view, methodInfo);
				}
				
				var buttonAttribute = member.GetCustomAttribute<ButtonAttribute>();
				if (buttonAttribute != null)
				{	
					var belement = new ButtonElement(caption)
					{
						Command = GetCommandForMember(view, member)
					};
					
					((ReflectiveCommand)belement.Command).Element = belement;

					belement.Command.CanExecuteChanged += HandleCanExecuteChanged;
					element = belement;
				}

				return element ?? _NoElement;
			});
			
			_ElementPropertyMap.Add(typeof(CLLocationCoordinate2D), (member, caption, view, bindings)=>
			{
				IElement element = null;
		
				var mapAttribute = member.GetCustomAttribute<MapAttribute>();
				var location = (CLLocationCoordinate2D)member.GetValue(view);
				if (mapAttribute != null)
					element = new MapElement(mapAttribute.Caption, location);

				return element;
			});

			_ElementPropertyMap.Add(typeof(string), (member, caption, view, bindings)=>
			{
				IElement element = null;
	
				var passwordAttribute = member.GetCustomAttribute<PasswordAttribute>();
				var entryAttribute = member.GetCustomAttribute<EntryAttribute>();
				var multilineAttribute = member.GetCustomAttribute<MultilineAttribute>();
				var htmlAttribute = member.GetCustomAttribute<HtmlAttribute>();
		
				if (passwordAttribute != null)
				{
					element = new EntryElement(caption) { Placeholder = passwordAttribute.Placeholder, KeyboardType = passwordAttribute.KeyboardType, IsPassword = true, EditMode = entryAttribute.EditMode, AutoCorrectionType = passwordAttribute.AutoCorrectionType, AutoCapitalizationType = passwordAttribute.AutoCapitalizationType };
				} 
				else if (entryAttribute != null)
				{
					element = new EntryElement(caption) { Placeholder = entryAttribute.Placeholder, KeyboardType = entryAttribute.KeyboardType, EditMode = entryAttribute.EditMode,  AutoCorrectionType = entryAttribute.AutoCorrectionType, AutoCapitalizationType = entryAttribute.AutoCapitalizationType };
				}
				else if (multilineAttribute != null)
					element = new MultilineElement(caption);
				else if (htmlAttribute != null)
				{
					SetDefaultConverter(view, member, "DataContext", new UriConverter(), null, bindings);
					element = new HtmlElement(caption);
				}
				else
				{
					var selement = new StringElement(caption, (string)member.GetValue(view)) { };
					
					element = selement;
				}
				
				return element;
			});

			_ElementPropertyMap.Add(typeof(Single), (member, caption, view, bindings)=>
			{
				return CreateFloatElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(Double), (member, caption, view, bindings)=>
			{
				return CreateFloatElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(Uri), (member, caption, view, bindings)=>
			{
				return new HtmlElement(caption, (Uri)member.GetValue(view));  
			});

			_ElementPropertyMap.Add(typeof(bool), (member, caption, view, bindings)=>
			{
				IElement element = null;

				var checkmarkAttribute = member.GetCustomAttribute<CheckmarkAttribute>();
				if (checkmarkAttribute != null)
				    element = new CheckboxElement(caption) {  };
				else
					element = new BooleanElement(caption) { };

				return element;
			});

			_ElementPropertyMap.Add(typeof(DateTime), (member, caption, view, bindings)=>
			{
				IElement element = null;

				SetDefaultConverter(view, member, "DataContext", new DateTimeConverter(), null, bindings);

				var dateAttribute = member.GetCustomAttribute<DateAttribute>();
				var timeAttribute = member.GetCustomAttribute<TimeAttribute>();

				if(dateAttribute != null)
					element = new DateElement(caption) { DataContext = (DateTime)member.GetValue(view)};
				else if (timeAttribute != null)
					element = new TimeElement(caption) { DataContext = (DateTime)member.GetValue(view)};
				else
					element = new DateTimeElement(caption) { DataContext = (DateTime)member.GetValue(view)};
				
				return element;
			});

			_ElementPropertyMap.Add(typeof(UIImage),(member, caption, view, bindings)=>
			{
				return new ImageElement((UIImage)member.GetValue(view));
			});

			_ElementPropertyMap.Add(typeof(Int32), (member, caption, view, bindings)=>
			{				
				return CreateIntElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(Int16), (member, caption, view, bindings)=>
			{				
				return CreateIntElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(Int64), (member, caption, view, bindings)=>
			{				
				return CreateIntElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(UInt32), (member, caption, view, bindings)=>
			{				
				return CreateIntElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(UInt16), (member, caption, view, bindings)=>
			{				
				return CreateIntElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(UInt64), (member, caption, view, bindings)=>
			{				
				return CreateIntElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(Byte), (member, caption, view, bindings)=>
			{				
				return CreateIntElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(SByte), (member, caption, view, bindings)=>
			{				
				return CreateIntElement(member, caption, view, bindings);
			});

			_ElementPropertyMap.Add(typeof(Decimal), (member, caption, view, bindings)=>
			{				
				return CreateFloatElement(member, caption, view, bindings);
			});
		}
		private ISection CreateMultiselectCollectionSection(MemberInfo member, string caption, object view, List<Binding> bindings)
		{
			object context = view;

			var csection = new Section() { IsMultiselect = true, Opaque = false };
			var index = 0;

			SetDefaultConverter(view, member, "DataContext", new EnumerableConverter(), null, bindings);
		
			var dataContextMember = GetMemberFromDataContext(member, ref context);

			var collection = dataContextMember.GetValue(context) as IEnumerable;

			foreach (var item in collection)
			{
				var checkboxElement = new CheckboxElement(item.ToString()) { Item = item, Index = index, DataContext = false};
				
				csection.Add(checkboxElement);
				index++;
			}
			
			csection.ViewBinding.DataContextCode = DataContextCode.MultiselectCollection;
			csection.ViewBinding.ViewType = null;

			return csection;
		}
		private ISection CreateEnumCollectionSection(MemberInfo member, string caption, object view, List<Binding> bindings)
		{
			Type memberType = GetTypeForMember(member);
			
			object context = view;
			var dataContext = view as IDataContext;

			if (dataContext != null)
			{
				context = dataContext.DataContext;
			}
			
			SetDefaultConverter(view, member, "DataContext", new EnumCollectionConverter(), null, bindings);

			member = GetMemberFromDataContext(member, ref context);

			var csection = new Section() { IsMultiselect = true, Opaque = false };

			var collection = member.GetValue(view);
			if (collection == null)
			{
				var collectionType = typeof(EnumCollection<>);
				var enumType = memberType.GetGenericArguments().FirstOrDefault();
				Type[] generic = { enumType };

				collection = Activator.CreateInstance(collectionType.MakeGenericType(generic));
				member.SetValue(view, collection);
			}

			var index = 0;
			var items = (EnumCollection)collection;
			foreach (var item in items.Items)
			{
				var checkboxElement = new CheckboxElement(item.Description) 
				{ 
					Item = item, 
					Index = index, 
					DataContext = item.IsChecked, 
					Group = item.GroupName
				};

				csection.Add(checkboxElement);				
				index++;
			}
			
			csection.DataContext = memberType;
			csection.ViewBinding.DataContextCode = DataContextCode.EnumCollection;

			return csection;
		}
        private void BuildElementPropertyMap()
        {
            _ElementPropertyMap = new Dictionary <Type, Func <MemberInfo, string, object, List <Binding>, IElement> >();
            _ElementPropertyMap.Add(typeof(MethodInfo), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var loadMoreAttribute = member.GetCustomAttribute <LoadMoreAttribute>();
                if (loadMoreAttribute != null)
                {
                    var normalCaption  = !string.IsNullOrEmpty(loadMoreAttribute.NormalCaption) ? loadMoreAttribute.NormalCaption: "Load More";
                    var loadingCaption = !string.IsNullOrEmpty(loadMoreAttribute.LoadingCaption) ? loadMoreAttribute.LoadingCaption: "Loading...";

                    element = new LoadMoreElement(normalCaption, loadingCaption, null)
                    {
                        Command = GetCommandForMember(view, member)
                    };
                }

                var searchbarAttribute = member.GetCustomAttribute <SearchbarAttribute>();
                var searchbar          = Root as ISearchBar;
                if (searchbarAttribute != null && searchbar != null)
                {
                    searchbar.SearchPlaceholder = searchbarAttribute.Placeholder;
                    searchbar.IncrementalSearch = searchbarAttribute.IncrementalSearch;
                    searchbar.EnableSearch      = true;
                    searchbar.IsSearchbarHidden = false;

                    var methodInfo          = member as MethodInfo;
                    searchbar.SearchCommand = new SearchCommand(view, methodInfo);
                }

                var buttonAttribute = member.GetCustomAttribute <ButtonAttribute>();
                if (buttonAttribute != null)
                {
                    var belement = new ButtonElement(caption)
                    {
                        Command = GetCommandForMember(view, member)
                    };

                    ((ReflectiveCommand)belement.Command).Element = belement;

                    belement.Command.CanExecuteChanged += HandleCanExecuteChanged;
                    element = belement;
                }

                return(element ?? _NoElement);
            });

            _ElementPropertyMap.Add(typeof(CLLocationCoordinate2D), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var mapAttribute = member.GetCustomAttribute <MapAttribute>();
                var location     = (CLLocationCoordinate2D)member.GetValue(view);
                if (mapAttribute != null)
                {
                    element = new MapElement(mapAttribute.Caption, location);
                }

                return(element);
            });

            _ElementPropertyMap.Add(typeof(string), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var passwordAttribute  = member.GetCustomAttribute <PasswordAttribute>();
                var entryAttribute     = member.GetCustomAttribute <EntryAttribute>();
                var multilineAttribute = member.GetCustomAttribute <MultilineAttribute>();
                var htmlAttribute      = member.GetCustomAttribute <HtmlAttribute>();

                if (passwordAttribute != null)
                {
                    element = new EntryElement(caption)
                    {
                        Placeholder = passwordAttribute.Placeholder, KeyboardType = passwordAttribute.KeyboardType, IsPassword = true, EditMode = entryAttribute.EditMode, AutoCorrectionType = passwordAttribute.AutoCorrectionType, AutoCapitalizationType = passwordAttribute.AutoCapitalizationType
                    };
                }
                else if (entryAttribute != null)
                {
                    element = new EntryElement(caption)
                    {
                        Placeholder = entryAttribute.Placeholder, KeyboardType = entryAttribute.KeyboardType, EditMode = entryAttribute.EditMode, AutoCorrectionType = entryAttribute.AutoCorrectionType, AutoCapitalizationType = entryAttribute.AutoCapitalizationType
                    };
                }
                else if (multilineAttribute != null)
                {
                    element = new MultilineElement(caption);
                }
                else if (htmlAttribute != null)
                {
                    SetDefaultConverter(view, member, "DataContext", new UriConverter(), null, bindings);
                    element = new HtmlElement(caption);
                }
                else
                {
                    var selement = new StringElement(caption, (string)member.GetValue(view))
                    {
                    };

                    element = selement;
                }

                return(element);
            });

            _ElementPropertyMap.Add(typeof(Single), (member, caption, view, bindings) =>
            {
                return(CreateFloatElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(Double), (member, caption, view, bindings) =>
            {
                return(CreateFloatElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(Uri), (member, caption, view, bindings) =>
            {
                return(new HtmlElement(caption, (Uri)member.GetValue(view)));
            });

            _ElementPropertyMap.Add(typeof(bool), (member, caption, view, bindings) =>
            {
                IElement element = null;

                var checkmarkAttribute = member.GetCustomAttribute <CheckmarkAttribute>();
                if (checkmarkAttribute != null)
                {
                    element = new CheckboxElement(caption)
                    {
                    }
                }
                ;
                else
                {
                    element = new BooleanElement(caption)
                    {
                    }
                };

                return(element);
            });

            _ElementPropertyMap.Add(typeof(DateTime), (member, caption, view, bindings) =>
            {
                IElement element = null;

                SetDefaultConverter(view, member, "DataContext", new DateTimeConverter(), null, bindings);

                var dateAttribute = member.GetCustomAttribute <DateAttribute>();
                var timeAttribute = member.GetCustomAttribute <TimeAttribute>();

                if (dateAttribute != null)
                {
                    element = new DateElement(caption)
                    {
                        DataContext = (DateTime)member.GetValue(view)
                    }
                }
                ;
                else if (timeAttribute != null)
                {
                    element = new TimeElement(caption)
                    {
                        DataContext = (DateTime)member.GetValue(view)
                    }
                }
                ;
                else
                {
                    element = new DateTimeElement(caption)
                    {
                        DataContext = (DateTime)member.GetValue(view)
                    }
                };

                return(element);
            });

            _ElementPropertyMap.Add(typeof(UIImage), (member, caption, view, bindings) =>
            {
                return(new ImageElement((UIImage)member.GetValue(view)));
            });

            _ElementPropertyMap.Add(typeof(Int32), (member, caption, view, bindings) =>
            {
                return(CreateIntElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(Int16), (member, caption, view, bindings) =>
            {
                return(CreateIntElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(Int64), (member, caption, view, bindings) =>
            {
                return(CreateIntElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(UInt32), (member, caption, view, bindings) =>
            {
                return(CreateIntElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(UInt16), (member, caption, view, bindings) =>
            {
                return(CreateIntElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(UInt64), (member, caption, view, bindings) =>
            {
                return(CreateIntElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(Byte), (member, caption, view, bindings) =>
            {
                return(CreateIntElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(SByte), (member, caption, view, bindings) =>
            {
                return(CreateIntElement(member, caption, view, bindings));
            });

            _ElementPropertyMap.Add(typeof(Decimal), (member, caption, view, bindings) =>
            {
                return(CreateFloatElement(member, caption, view, bindings));
            });
        }
		private void BuildElementPropertyMap()
		{
			_ElementPropertyMap = new Dictionary<Type, Func<MemberInfo, string, object, List<Binding>, IElement>>();
			_ElementPropertyMap.Add(typeof(MethodInfo), (member, caption, view, bindings)=>
			{
				IElement element = null;
	
				var buttonAttribute = member.GetCustomAttribute<ButtonAttribute>();
				if (buttonAttribute != null)
				{	
					var belement = new ButtonElement(caption)
					{
						Command = GetCommandForMember(view, member)
					};
					
					((ReflectiveCommand)belement.Command).Element = belement;

					belement.Command.CanExecuteChanged += HandleCanExecuteChanged;
					element = belement;
				}
				
				var loadMoreAttribute = member.GetCustomAttribute<LoadMoreAttribute>();
				if (loadMoreAttribute != null)
				{
					var normalCaption = !string.IsNullOrEmpty(loadMoreAttribute.NormalCaption) ? loadMoreAttribute.NormalCaption: "Load More";
					var loadingCaption =  !string.IsNullOrEmpty(loadMoreAttribute.LoadingCaption) ? loadMoreAttribute.LoadingCaption: "Loading...";

					element = new LoadMoreElement(normalCaption, loadingCaption, null) { Command = GetCommandForMember(view, member) };
				}

				var enableSearchAttribute = member.GetCustomAttribute<EnableSearchAttribute>();
				var searchbar = Root as ISearchBar;
				if (enableSearchAttribute != null && searchbar != null)
				{
					searchbar.AutoHideSearch = enableSearchAttribute.AutoHide;
					searchbar.SearchPlaceholder = enableSearchAttribute.Placeholder;
					searchbar.IncrementalSearch = enableSearchAttribute.IncrementalSearch;
					searchbar.EnableSearch = true;
					
					var methodInfo = member as MethodInfo;
					searchbar.SearchCommand = new SearchCommand(view, methodInfo);
				}

				return element;
			});

			_ElementPropertyMap.Add(typeof(CLLocationCoordinate2D), (member, caption, view, bindings)=>
			{
				IElement element = null;
		
				var mapAttribute = member.GetCustomAttribute<MapAttribute>();
				var location = (CLLocationCoordinate2D)GetValue(member, view);
				if (mapAttribute != null)
					element = new MapElement(mapAttribute.Caption, location);

				return element;
			});

			_ElementPropertyMap.Add(typeof(string), (member, caption, view, bindings)=>
			{
				IElement element = null;
	
				var passwordAttribute = member.GetCustomAttribute<PasswordAttribute>();
				var entryAttribute = member.GetCustomAttribute<EntryAttribute>();
				var multilineAttribute = member.GetCustomAttribute<MultilineAttribute>();
				var htmlAttribute = member.GetCustomAttribute<HtmlAttribute>();
		
				if (passwordAttribute != null)
				{
					element = new EntryElement(caption) { Placeholder = passwordAttribute.Placeholder, KeyboardType = passwordAttribute.KeyboardType, IsPassword = true, EditMode = entryAttribute.EditMode, AutoCorrectionType = passwordAttribute.AutoCorrectionType, AutoCapitalizationType = passwordAttribute.AutoCapitalizationType };
				} 
				else if (entryAttribute != null)
				{
					element = new EntryElement(caption) { Placeholder = entryAttribute.Placeholder, KeyboardType = entryAttribute.KeyboardType, EditMode = entryAttribute.EditMode,  AutoCorrectionType = entryAttribute.AutoCorrectionType, AutoCapitalizationType = entryAttribute.AutoCapitalizationType };
				}
				else if (multilineAttribute != null)
					element = new MultilineElement(caption);
				else if (htmlAttribute != null)
				{
					SetDefaultConverter(member, "Value", new UriConverter(), bindings);
					element = new HtmlElement(caption);
				}
				else
				{
					var selement = new StringElement(caption, (string)GetValue(member, view)) { };
					
					element = selement;
				}
				
				return element;
			});

			_ElementPropertyMap.Add(typeof(float), (member, caption, view, bindings)=>
			{
				IElement element = null;
				var rangeAttribute = member.GetCustomAttribute<RangeAttribute>();
				if (rangeAttribute != null)
				{
					var floatElement = new FloatElement(caption) {  ShowCaption = rangeAttribute.ShowCaption, MinValue = rangeAttribute.Low, MaxValue = rangeAttribute.High, Value = rangeAttribute.Low };
					element = floatElement;
				}
				else 
				{		
					var entryAttribute = member.GetCustomAttribute<EntryAttribute>();
					string placeholder = null;
					var keyboardType = UIKeyboardType.NumberPad;

					if(entryAttribute != null)
					{
						placeholder = entryAttribute.Placeholder;
						if(entryAttribute.KeyboardType != UIKeyboardType.Default)
							keyboardType = entryAttribute.KeyboardType;
					}

					element = new EntryElement(caption) { Placeholder = placeholder, KeyboardType = keyboardType};
				}

				return element;
			});
			
			_ElementPropertyMap.Add(typeof(Uri), (member, caption, view, bindings)=>
			{
				return new HtmlElement(caption, (Uri)GetValue(member, view));  
			});

			_ElementPropertyMap.Add(typeof(bool), (member, caption, view, bindings)=>
			{
				IElement element = null;

				var checkboxAttribute = member.GetCustomAttribute<CheckboxAttribute>();
				if (checkboxAttribute != null)
				    element = new CheckboxElement(caption) {  };
				else
					element = new BooleanElement(caption) { };

				return element;
			});

			_ElementPropertyMap.Add(typeof(DateTime), (member, caption, view, bindings)=>
			{
				IElement element = null;

				var dateAttribute = member.GetCustomAttribute<DateAttribute>();
				var timeAttribute = member.GetCustomAttribute<TimeAttribute>();

				if(dateAttribute != null)
					element = new DateElement(caption) { Value = (DateTime)GetValue(member, view)};
				else if (timeAttribute != null)
					element = new TimeElement(caption) { Value = (DateTime)GetValue(member, view)};
				else
					element = new DateTimeElement(caption) { Value = (DateTime)GetValue(member, view)};
				
				return element;
			});

			_ElementPropertyMap.Add(typeof(UIImage),(member, caption, view, bindings)=>
			{
				return new ImageElement();
			});

			_ElementPropertyMap.Add(typeof(int), (member, caption, view, bindings)=>
			{
				SetDefaultConverter(member, "Value", new IntConverter(), bindings);
				return new StringElement(caption) { Value = GetValue(member, view).ToString() };
			});
		}
		public IElement CreateEnumCollectionRoot(MemberInfo member, string caption, object view, List<Binding> bindings)
		{
			Type memberType = GetTypeForMember(member);

			SetDefaultConverter(member, "Value", new EnumItemsConverter(), bindings);

			var csection = new Section() { IsMultiselect = true, Opaque = false };
			ApplyRootTheme(view, csection);

			var collection = GetValue(member, view);
			if (collection == null)
			{
				var collectionType = typeof(EnumCollection<>);
				var enumType = memberType.GetGenericArguments()[0];
				Type[] generic = { enumType };

				collection = Activator.CreateInstance(collectionType.MakeGenericType(generic));
				(member as PropertyInfo).SetValue(view, collection, new object[] {});
			}

			var index = 0;
			var items = (EnumCollection)collection;
			foreach (var item in items.AllValues)
			{
				var checkboxElement = new CheckboxElement(item.Description) { Index = index, Value = item.IsChecked, Group = item.GroupName};
				ApplyRootTheme(view, checkboxElement);

				csection.Add(checkboxElement);
				
				index++;
			}
			
			var element = new RootElement(caption) { csection };
			element.ViewBinding.DataContextCode = DataContextCode.EnumCollection;

			element.Theme.CellStyle = UITableViewCellStyle.Value1;

			return element;
		}