Shiny Controls v1.0 - The Ultra Control Suite for .NET MAUI & BlazorO...M...G!
Scheduler | Event List
A vertically scrolling event list grouped by day with infinite scroll in both directions. Uses CollectionView for virtualization (RecyclerView on Android, UICollectionView on iOS).
<scheduler:SchedulerCalendarListView Provider="{Binding Provider}" SelectedDate="{Binding SelectedDate}" DefaultEventColor="CornflowerBlue" DaysPerPage="30" />Properties
Section titled “Properties”| Property | Type | Default | Description |
|---|---|---|---|
Provider |
ISchedulerEventProvider? |
null |
Event data source |
SelectedDate |
DateOnly |
Today | Two-way bound; centers the list on this date |
MinDate |
DateOnly? |
null |
Earliest loadable date (stops backward scroll) |
MaxDate |
DateOnly? |
null |
Latest loadable date (stops forward scroll) |
EventItemTemplate |
DataTemplate? |
null |
Custom template for event items |
DayHeaderTemplate |
DataTemplate? |
null |
Custom template for day group headers |
LoaderTemplate |
DataTemplate? |
null |
Custom loading indicator |
DaysPerPage |
int |
30 |
Days loaded per incremental fetch |
DefaultEventColor |
Color |
CornflowerBlue | Default color for event indicators |
DayHeaderBackgroundColor |
Color |
Transparent | Background of day headers |
DayHeaderTextColor |
Color |
Black | Text color of day headers |
StickyDayHeaders |
bool |
true |
Pin the current day group’s header to the top while scrolling |
AllowPan |
bool |
true |
Enable scroll gestures |
AllowZoom |
bool |
false |
Enable pinch-to-zoom |
Behavior
Section titled “Behavior”- Grouped by day — Each day with events gets a header (e.g. “Monday, March 30, 2026”)
- Sticky day headers — The current day group’s header pins to the top of the list while scrolling and swaps as the next group reaches it. The pinned header is input-transparent (scroll gestures pass through). Disable with
StickyDayHeaders="False". ChangingDayHeaderTemplateorEventItemTemplateat runtime re-applies immediately - Empty days skipped — Only days with events appear in the list
- Today indicator — Day headers show a dot for today
- Event count — Day headers display event count (e.g. “3 events”)
- Multi-day events — Appear in each day they span
- Sort order — All-day events sort to top, then timed events by start time
- Event items — Show start–end time range or “All Day” with color indicator
- Tap events — Triggers
Provider.OnEventSelected() - Initial load — Centers on
SelectedDateand loadsDaysPerPagedays in each direction
Infinite Scroll
Section titled “Infinite Scroll”The list automatically loads more data as you scroll:
- Scrolling down — When
RemainingItemsThresholdis reached, the nextDaysPerPagedays are appended - Scrolling up — When the first few items are visible, the previous
DaysPerPagedays are prepended - Bounded —
MinDateandMaxDatestop loading at their respective boundaries
Day Header Template
Section titled “Day Header Template”The DayHeaderTemplate binds to CalendarListDayGroup:
public class CalendarListDayGroup : List<SchedulerEvent>{ public DateOnly Date { get; } public string DateDisplay { get; } // "dddd, MMMM d, yyyy" public bool IsToday { get; } public string EventCountDisplay { get; } // "3 events"}ListView.DayHeaderTemplate = new DataTemplate(() =>{ var grid = new Grid { ColumnDefinitions = { new ColumnDefinition(GridLength.Star), new ColumnDefinition(GridLength.Auto) }, Padding = new Thickness(16, 8) };
var dateLabel = new Label { FontAttributes = FontAttributes.Bold, FontSize = 16 }; dateLabel.SetBinding(Label.TextProperty, static (CalendarListDayGroup g) => g.DateDisplay);
var countLabel = new Label { FontSize = 12, TextColor = Colors.Gray }; countLabel.SetBinding(Label.TextProperty, static (CalendarListDayGroup g) => g.EventCountDisplay);
grid.Add(dateLabel, 0); grid.Add(countLabel, 1); return grid;});Event Item Template
Section titled “Event Item Template”The EventItemTemplate binds to SchedulerEvent. The default shows a card with color bar, title, description, and time range.
ListView.EventItemTemplate = new DataTemplate(() =>{ var grid = new Grid { ColumnDefinitions = { new ColumnDefinition(new GridLength(4)), new ColumnDefinition(GridLength.Star) }, Padding = new Thickness(8), ColumnSpacing = 8 };
var colorBar = new BoxView { CornerRadius = 2 }; colorBar.SetBinding(BoxView.ColorProperty, static (SchedulerEvent e) => e.Color);
var title = new Label { FontSize = 14, FontAttributes = FontAttributes.Bold }; title.SetBinding(Label.TextProperty, static (SchedulerEvent e) => e.Title);
grid.Add(colorBar, 0); grid.Add(title, 1); return grid;});

