This page shows how to bind a grouped list of items to a CollectionView
Large data sets can often become unwieldy when presented in a continually scrolling list. In this scenario, organizing the data into groups can improve the user experience by making it easier to navigate the data.
In MauiReactor you can create a grouped view of your collection using an overload of the ItemsSource prop method as shown in the example below:
public class Animal
{
public string Name { get; set; }
public string Location { get; set; }
public string Details { get; set; }
public string ImageUrl { get; set; }
public override string ToString()
{
return Name;
}
}
public class AnimalGroup : List<Animal>
{
public string Name { get; private set; }
public AnimalGroup(string name, List<Animal> animals) : base(animals)
{
Name = name;
}
public override string ToString()
{
return Name;
}
}
class MainPageGroupingState
{
public IEnumerable<AnimalGroup> Animals { get; set; }
}
class MainPageGrouping : Component<MainPageGroupingState>
{
protected override void OnMounted()
{
State.Animals = CreateAnimalsCollection(false);
base.OnMounted();
}
public override VisualNode Render()
{
return new ContentPage
{
new CollectionView()
.IsGrouped(true)
.ItemsSource<CollectionView, AnimalGroup, Animal>(State.Animals, RenderPerson, RenderHeader, RenderFooter)
};
}
private VisualNode RenderPerson(Animal animal)
{
return new Grid("*,*", "64, *")
{
new Image(animal.ImageUrl)
.GridRowSpan(2),
new Label(animal.Name)
.GridColumn(1),
new Label(animal.Location)
.GridRow(1)
.GridColumn(1)
.FontSize(12)
.TextColor(Colors.Gray)
}
.HeightRequest(68)
.Padding(4);
}
private VisualNode RenderHeader(AnimalGroup group)
{
return new Label(group.Name)
.Padding(5)
.FontSize(40)
.BackgroundColor(Colors.Gray)
.TextColor(Colors.White);
}
private VisualNode RenderFooter(AnimalGroup group)
{
return new Label($"Animals in the group: {group.Count}")
.Padding(5);
}
private static IEnumerable<AnimalGroup> CreateAnimalsCollection(bool includeEmptyGroups)
{
...
return animals;
}
}