Component with children
Describes how to create components with children

Last updated
class PageComponent : Component
{
public override VisualNode Render()
=> NavigationPage(
ContentPage("Component With Children")
);
}public class WrapGrid : Component
{
public override VisualNode Render()
{
}
}class WrapGrid : Component
{
public override VisualNode Render()
=> Grid(Children());
}
partial class WrapGrid : Component
{
[Prop]
private int _columnCount = 4;
public override VisualNode Render()
{
int rowIndex = 0, colIndex = 0;
int rowCount = Math.DivRem(Children().Count, _columnCount, out var divRes);
if (divRes > 0)
rowCount++;
return new Grid(
Enumerable.Range(1, rowCount).Select(_ => new RowDefinition() { Height = GridLength.Auto }),
Enumerable.Range(1, _columnCount).Select(_ => new ColumnDefinition()))
{
Children().Select(child =>
{
child.GridRow(rowIndex);
child.GridColumn(colIndex);
colIndex++;
if (colIndex == _columnCount)
{
colIndex = 0;
rowIndex++;
}
return child;
}).ToArray()
};
}
}class PageState
{
public int ColumnCount { get; set; } = 1;
public int ItemCount { get; set; } = 3;
}
class PageComponent : Component<PageState>
{
public override VisualNode Render()
{
return new NavigationPage()
{
new ContentPage()
{
new StackLayout()
{
new Label($"Columns {State.ColumnCount}")
.FontSize(14),
new Stepper()
.Minimum(1)
.Maximum(10)
.Increment(1)
.Value(State.ColumnCount)
.OnValueChanged(_=> SetState(s => s.ColumnCount = (int)_.NewValue)),
new Label($"Items {State.ItemCount}")
.FontSize(Xamarin.Forms.NamedSize.Large),
new Stepper()
.Minimum(1)
.Maximum(20)
.Increment(1)
.Value(State.ItemCount)
.OnValueChanged(_=> SetState(s => s.ItemCount = (int)_.NewValue)),
new WrapGrid()
{
Enumerable.Range(1, State.ItemCount)
.Select(_=> new Button($"Item {_}"))
.ToArray()
}
.ColumnCount(State.ColumnCount)
}
.Padding(10)
.WithVerticalOrientation()
}
.Title("Component With Children")
};
}
}