Пример #1
0
        public override void Draw(RectangleF rect)
        {
            if (ListSource != null)
            {
                Theme.Cell = this;

                TextLabel.BackgroundColor = UIColor.Clear;
                if (DetailTextLabel != null)
                {
                    DetailTextLabel.BackgroundColor = UIColor.Clear;
                }

                if (ListSource.IsRootCell)
                {
                    Accessory      = UITableViewCellAccessory.DisclosureIndicator;
                    TextLabel.Text = ListSource.Caption;

                    if (ListSource.IsMultiselect && DetailTextLabel != null)
                    {
                        DetailTextLabel.Text = ListSource.SelectedItems.Count.ToString();
                    }
                    else
                    {
                        if (ListSource.SelectedItem != null)
                        {
                            if (ListSource.ReplaceCaptionWithSelection)
                            {
                                TextLabel.Text = ListSource.SelectedItem.ToString();
                            }
                            else if (DetailTextLabel != null)
                            {
                                DetailTextLabel.Text = ListSource.SelectedItem.ToString();
                            }
                        }
                    }
                }
                else
                {
                    var sectionData = ListSource.GetSectionData(0);
                    if (sectionData.Count > 0 && IndexPath.Row < sectionData.Count)
                    {
                        TextLabel.Text = sectionData[IndexPath.Row].ToString();
                    }
                }
            }

            var resizedRows = false;

            if (ViewList != null)
            {
                foreach (var view in ViewList)
                {
                    var sectionData = ListSource.GetSectionData(0);
                    if (sectionData != null && sectionData.Count > 0)
                    {
                        var data = sectionData[IndexPath.Row];
                        var dc   = view as IDataContext <object>;
                        if (dc != null)
                        {
                            dc.DataContext = data;
                        }

                        if (dc == null)
                        {
                            var valueMember = view.GetType().GetProperty("Value");
                            if (valueMember != null && data.GetType().IsAssignableFrom(valueMember.PropertyType))
                            {
                                valueMember.SetValue(view, data);
                            }
                            else
                            {
                                var dataContextMember = view.GetType().GetProperty("DataContext");
                                if (dataContextMember != null && data.GetType().IsAssignableFrom(dataContextMember.PropertyType))
                                {
                                    dataContextMember.SetValue(view, data);
                                }
                            }
                        }

                        var updateable = view as IUpdateable;
                        if (updateable != null)
                        {
                            updateable.UpdateCell(this, IndexPath);
                        }

                        var rowHeight = 0f;
                        var themeable = view as IThemeable;
                        if (themeable != null)
                        {
                            themeable.ApplyTheme(this);
                            if (themeable.Theme != null && themeable.Theme.CellHeight > 0)
                            {
                                rowHeight = themeable.Theme.CellHeight;
                            }
                        }

                        var sizeable = view as ISizeable;
                        if (sizeable != null)
                        {
                            rowHeight = sizeable.GetRowHeight();
                        }

                        if (rowHeight > 0 && ListSource.RowHeights[ListSource.BaseIndexPath] != rowHeight)
                        {
                            if (ListSource.RowHeights.ContainsKey(IndexPath))
                            {
                                if (ListSource.RowHeights[IndexPath] != rowHeight)
                                {
                                    ListSource.RowHeights[IndexPath] = rowHeight;
                                    resizedRows = true;
                                }
                            }
                            else
                            {
                                ListSource.RowHeights.Add(IndexPath, rowHeight);
                                resizedRows = true;
                            }
                        }

                        var customDraw = view as ICustomDraw;
                        if (customDraw != null)
                        {
                            customDraw.Draw(rect);
                        }
                    }
                }

                if (resizedRows)
                {
                    new Wait(TimeSpan.FromMilliseconds(0), () =>
                    {
                        ListSource.Controller.TableView.BeginUpdates();
                        ListSource.Controller.TableView.EndUpdates();
                    });
                }
            }
        }
Пример #2
0
        protected void CreateViewList(IList <Type> viewTypes)
        {
            var frame = new RectangleF(0, 0, ContentView.Bounds.Width, ContentView.Bounds.Height);

            if (ViewList != null)
            {
                foreach (var view in ViewList)
                {
                    view.Dispose();
                }

                ViewList.Clear();
                ViewList = null;
            }

            ViewList = new List <UIView>();

            if (viewTypes != null)
            {
                foreach (var viewType in viewTypes)
                {
                    if (viewType == null)
                    {
                        continue;
                    }

                    UIView view         = null;
                    var    hasFrameCtor = viewType.GetConstructor(new Type[] { typeof(RectangleF) }) != null;
                    if (hasFrameCtor)
                    {
                        view = Activator.CreateInstance(viewType, new object[] { frame }) as UIView;

                        if (ListSource.RowHeights[ListSource.BaseIndexPath] != view.Frame.Height)
                        {
                            if (ListSource.RowHeights.ContainsKey(IndexPath))
                            {
                                ListSource.RowHeights[IndexPath] = view.Frame.Height;
                            }
                            else
                            {
                                ListSource.RowHeights.Add(IndexPath, view.Frame.Height);
                            }
                        }
                    }
                    else
                    {
                        view = Activator.CreateInstance(viewType) as UIView;
                    }

                    var dc = view as IDataContext <object>;
                    if (dc != null)
                    {
                        var item = ListSource.GetSectionData(0)[IndexPath.Row];
                        dc.DataContext = item;
                    }

                    var initializeCell = view as IInitializeCell;
                    if (initializeCell != null)
                    {
                        initializeCell.Cell       = this;
                        initializeCell.Controller = ListSource.Controller;

                        var newCellStyle = initializeCell.CellStyle;
                        if (newCellStyle != Style)
                        {
                            Style = newCellStyle;
                            break;
                        }
                    }

                    var themeable = view as IThemeable;
                    if (themeable != null)
                    {
                        if (themeable.Theme == null)
                        {
                            var theme = view.GetType().GetCustomAttribute <ThemeAttribute>();
                            if (theme != null)
                            {
                                var cellViewTheme = Theme.CreateTheme(theme.ThemeType);
                                if (cellViewTheme != null)
                                {
                                    if (Theme != null)
                                    {
                                        Theme.MergeTheme(cellViewTheme);
                                    }
                                    else
                                    {
                                        Theme = cellViewTheme;
                                    }

                                    themeable.Theme = Theme;
                                }
                            }
                        }

                        themeable.InitializeTheme(this);
                    }

                    var cellContent = view as ICellContent;
                    if (cellContent != null)
                    {
                        if (cellContent.CellContentView != null)
                        {
                            _CompositeView.AddSubview(cellContent.CellContentView);
                        }
                    }

                    ViewList.Add(view);
                }
            }
        }