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(); }); } } }
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); } } }