Xamarin.iOS のドキュメント
カスタムセル
コントロール > FlexGrid > 機能 > カスタムセル

FlexGrid には、セルのコンテンツを完全に制御できる formatItem プロパティがあります。UIView クラスと GridCellType 列挙を追加することで各列をカスタマイズでき、セルコンテンツをコード内で完全にカスタマイズできます。

次の図は、パフォーマンスを表すセルテンプレートとして C1Gauge を設定したときの FlexGrid を示しています。

Customized Cells in FlexGrid

次のコード例は、FlexGrid コントロールにカスタムセル内容を追加する方法を示します。例では、「クイックスタート」セクションで作成したサンプルを使用します。

CS
コードのコピー
public partial class ViewController : UIViewController
{
    public ViewController(IntPtr handle) : base(handle)
    {

    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        // ビューを読み込んだ後の追加セットアップを行います(通常は nib から)。
        Grid.AutoGenerateColumns = false;

        Grid.Columns.Add(new GridRadialGaugeColumn() { Binding = "OrderTotal", Header = "注文合計", Width = GridLength.Star });
        Grid.Columns.Add(new GridColumn() { Binding = "FirstName", Width = GridLength.Star });
        Grid.Columns.Add(new GridColumn() { Binding = "LastName", Width = GridLength.Star });            

        var data = Customer.GetCustomerList(100);
        Grid.ItemsSource = data;
    }

    public class GridRadialGaugeColumn : GridColumn
    {
        protected override object GetCellContentType(GridCellType cellType)
        {
            if (cellType == GridCellType.Cell)
            {
                 return typeof(C1BulletGraph);
            }
            else
            {
                return base.GetCellContentType(cellType);
            }
        }
        protected override UIView CreateCellContent(GridCellType cellType, object cellContentType)
        {
            if (cellType == GridCellType.Cell)
            {
                var gauge = new C1BulletGraph();
                gauge.Max = 10000;
                gauge.Target = 7000;
                gauge.Bad = 1000;
                gauge.Good = 6000;
                return gauge;
            }
            else
            {
                return base.CreateCellContent(cellType, cellContentType);
            }
        }

        protected override void BindCellContent(UIView cellContent, GridCellType cellType, GridRow row)
        {
            if (cellType == GridCellType.Cell)
            {
                var gauge = cellContent as C1BulletGraph;
                gauge.Value = (double)GetCellValue(cellType, row);
            }
            else
            {
                base.BindCellContent(cellContent, cellType, row);
            }
        }
    }

    public override void DidReceiveMemoryWarning()
    {
        base.DidReceiveMemoryWarning();
        // 使用されていないキャッシュされたデータ、イメージなどを解放します
    }
}