Пример #1
0
        public void Selected(DialogViewController dvc, UITableView tableView, NSIndexPath path)
        {
            var root = BindingContext.CreateRootedView(this);

            if (root != null)
            {
                ((RootElement)root).ActivateController(dvc, tableView, path);
            }
            else
            {
                ActivateController(dvc, tableView, path);
            }
        }
Пример #2
0
        private IElement GetRootElementForMember(Theme theme, UIView view, MemberInfo member, List <Binding> bindings)
        {
            var memberType = GetTypeForMember(member);
            var caption    = GetCaption(member);

            IElement root        = null;
            Type     viewType    = memberType;
            Type     elementType = null;

            var genericType = memberType.GetGenericArguments().FirstOrDefault();

            if (genericType != null)
            {
                viewType = genericType;
            }

            var listAttribute = member.GetCustomAttribute <ListAttribute>();

            if (listAttribute != null && listAttribute.ViewType != null)
            {
                viewType    = listAttribute.ViewType;
                elementType = listAttribute.ElementType;
            }

            var rootAttribute = member.GetCustomAttribute <RootAttribute>();

            if (rootAttribute != null && rootAttribute.ViewType != null)
            {
                viewType    = rootAttribute.ViewType;
                elementType = rootAttribute.ElementType;
            }

            var isEnum           = memberType.IsEnum;
            var isEnumCollection = typeof(EnumCollection).IsAssignableFrom(memberType);
            var isMultiselect    = member.GetCustomAttribute <MultiSelectionAttribute>() != null;
            var isSelect         = member.GetCustomAttribute <SelectionAttribute>() != null;
            var isView           = typeof(IView).IsAssignableFrom(memberType) || typeof(IView).IsAssignableFrom(viewType);
            var isUIView         = typeof(UIView).IsAssignableFrom(memberType) || typeof(UIView).IsAssignableFrom(viewType);

            var isEnumerable = typeof(IEnumerable).IsAssignableFrom(memberType) && !(isView || isUIView);

            var isList = member.GetCustomAttribute <ListAttribute>() != null;

            if (isEnum || isEnumCollection || isMultiselect || isSelect)
            {
                ISection section = GetSectionElementForMember(theme, view, member, bindings);
                if (!isList && section != null)
                {
                    var rootElement = new RootElement()
                    {
                        section
                    };
                    rootElement.Caption = caption;
                    rootElement.Opaque  = false;
                    rootElement.Theme   = Theme.CreateTheme(Root.Theme);

                    rootElement.ViewBinding     = section.ViewBinding;
                    rootElement.Theme.CellStyle = GetCellStyle(member, UITableViewCellStyle.Value1);
                    root = rootElement;
                }
                else
                {
                    root = section as IElement;
                }
            }
            else if (isEnumerable)
            {
                var rootElement = CreateEnumerableRoot(theme, member, caption, view, bindings);
                if (isList)
                {
                    root = rootElement.Sections.FirstOrDefault() as IElement;
                }
                else
                {
                    root = rootElement as IElement;
                }
            }
            else if (isView || isUIView)
            {
                object     dataContext       = view;
                MemberInfo dataContextMember = GetMemberFromDataContext(member, ref dataContext);
                var        items             = dataContextMember.GetValue(dataContext);

                var rootElement = new RootElement(caption)
                {
                    Opaque = false
                };

                rootElement.Theme = Theme.CreateTheme(Root.Theme);
                rootElement.ViewBinding.MemberInfo      = dataContextMember;
                rootElement.ViewBinding.ElementType     = elementType;
                rootElement.ViewBinding.ViewType        = viewType;
                rootElement.ViewBinding.DataContextCode = DataContextCode.Object;
                rootElement.DataContext     = dataContext;
                rootElement.Theme.CellStyle = GetCellStyle(member, UITableViewCellStyle.Default);

                if (items != null)
                {
                    if (items is UIView)
                    {
                        rootElement.ViewBinding.View = items as UIView;
                    }
                    else
                    {
                        rootElement.DataContext = items;
                    }
                }

                if (genericType != null)
                {
                    SetDefaultConverter(view, member, "DataContext", new EnumerableConverter(), null, bindings);
                    rootElement.ViewBinding.DataContextCode = DataContextCode.ViewEnumerable;
                    rootElement.ViewBinding.ViewType        = viewType;
                }

                if (isList)
                {
                    var innerRoot = BindingContext.CreateRootedView(rootElement);
                    root = innerRoot as IElement;
                }
                else
                {
                    root = rootElement;
                }
            }
            else
            {
                throw new Exception(string.Format("Unknown type ({0}). Are you missing a [Root] or [List] attribute?", memberType));
            }

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

            return(root);
        }