Category / Section
How to show events in custom agenda view using list view in Xamarin.Forms Calendar?
3 mins read
SfCalendar allows you to display the calendar events in custom AgendaView.
This article explains how to display the calendar events in custom AgendaView using list view.
Step 1: Set ShowInlineEvents to false to add the custom agenda view; it restricts the opening of default calendar inline view.
<syncfusion:SfCalendar x:Name="Calendar" ShowInlineEvents="false"/>
Step 2: Bind the calendar events, namely StartTime, EndTime and Subject to text label to display the appointments in ListView as custom agenda view for calendar.
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:CustomListAgendaView" xmlns:syncfusion="clr-namespace:Syncfusion.SfCalendar.XForms;assembly=Syncfusion.SfCalendar.XForms" x:Class="CustomListAgendaView.MainPage"> <ContentPage.Resources> <ResourceDictionary> <local:DateTimeToStringConverter x:Key="stringConverter"/> </ResourceDictionary> </ContentPage.Resources> <ContentPage.Behaviors> <local:CalendarBehavior/> </ContentPage.Behaviors> <StackLayout Padding="0,30,0,0"> <syncfusion:SfCalendar x:Name="Calendar" ShowInlineEvents="false" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"/> <ListView x:Name="ListView"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <StackLayout Orientation="Vertical" Grid.Column="0"> <Label Text = "{Binding StartTime, Converter={StaticResource stringConverter}}" FontSize="14" /> <Label Text="{Binding EndTime, Converter={StaticResource stringConverter}}" FontSize="14"/> </StackLayout> <StackLayout Orientation="Vertical" Padding="40,0,0,0" Grid.Column="1"> <Label Text = "{Binding Subject}" FontSize="20" FontAttributes="Bold" /> </StackLayout> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackLayout> </ContentPage>
By using the SelectionChanged event of SfCalendar, calendar events are bound to ListView ItemSource based on the date selected.
namespace CustomListAgendaView { public class CalendarBehavior : Behavior<ContentPage> { private SfCalendar calendar; ListView listView; private CalendarEventCollection calendarInlineEvents; private ObservableCollection<string> meetingSubjectCollection; private ObservableCollection<Color> colorCollection; public CalendarBehavior() { calendarInlineEvents = new CalendarEventCollection(); this.AddAppointmentDetails(); this.AddAppointments(); } protected override void OnAttachedTo(ContentPage bindable) { var page = bindable as Page; calendar = page.FindByName<SfCalendar>("Calendar"); listView = page.FindByName<ListView>("ListView"); calendar.SelectionChanged += Calendar_SelectionChanged; listView.ItemsSource = GetSelectedDateAppointments(DateTime.Now.Date); // Setting data source for 3 months. calendar.DataSource = calendarInlineEvents; base.OnAttachedTo(bindable); } protected override void OnDetachingFrom(ContentPage bindable) { calendar.SelectionChanged -= Calendar_SelectionChanged; base.OnDetachingFrom(bindable); } /// <summary> /// Calendars selection changed. /// </summary> /// <param name="sender">Sender.</param> /// <param name="e">E.</param> void Calendar_SelectionChanged(object sender, SelectionChangedEventArgs e) { // Setting ItemSource for ListView based on appointment selection. listView.ItemsSource = GetSelectedDateAppointments(calendar.SelectedDate); } /// <summary> /// Gets the selected date appointments. /// </summary> /// <returns>The selected date appointments.</returns> /// <param name="date">Date.</param> public CalendarEventCollection GetSelectedDateAppointments(DateTime? date) { CalendarEventCollection selectedDateAppointments = new CalendarEventCollection(); for (int i = 0; i < calendarInlineEvents.Count; i++) { DateTime startDate = calendarInlineEvents[i].StartTime; if (date.Value.Day == startDate.Day && date.Value.Month == startDate.Month && date.Value.Year == startDate.Year) { selectedDateAppointments.Add(calendarInlineEvents[i]); } } return selectedDateAppointments; } /// <summary> /// Adds the appointment details. /// </summary> private void AddAppointmentDetails() { meetingSubjectCollection = new ObservableCollection<string>(); meetingSubjectCollection.Add("General Meeting"); meetingSubjectCollection.Add("Plan Execution"); meetingSubjectCollection.Add("Project Plan"); meetingSubjectCollection.Add("Consulting"); meetingSubjectCollection.Add("Support"); meetingSubjectCollection.Add("Development Meeting"); meetingSubjectCollection.Add("Scrum"); meetingSubjectCollection.Add("Project Completion"); meetingSubjectCollection.Add("Release updates"); meetingSubjectCollection.Add("Performance Check"); colorCollection = new ObservableCollection<Color>(); colorCollection.Add(Color.FromHex("#FFA2C139")); colorCollection.Add(Color.FromHex("#FFD80073")); colorCollection.Add(Color.FromHex("#FF1BA1E2")); colorCollection.Add(Color.FromHex("#FFE671B8")); colorCollection.Add(Color.FromHex("#FFF09609")); colorCollection.Add(Color.FromHex("#FF339933")); colorCollection.Add(Color.FromHex("#FF00ABA9")); colorCollection.Add(Color.FromHex("#FFE671B8")); colorCollection.Add(Color.FromHex("#FF1BA1E2")); colorCollection.Add(Color.FromHex("#FFD80073")); colorCollection.Add(Color.FromHex("#FFA2C139")); colorCollection.Add(Color.FromHex("#FFA2C139")); colorCollection.Add(Color.FromHex("#FFD80073")); colorCollection.Add(Color.FromHex("#FF339933")); colorCollection.Add(Color.FromHex("#FFE671B8")); colorCollection.Add(Color.FromHex("#FF00ABA9")); } /// <summary> /// Adds appointments. /// </summary> private void AddAppointments() { var today = DateTime.Now.Date; var random = new Random(); for (int month = -1; month < 2; month++) { for (int day = -5; day < 5; day++) { for (int count = 0; count < 2; count++) { var appointment = new CalendarInlineEvent(); appointment.Subject = meetingSubjectCollection[random.Next(7)]; appointment.Color = colorCollection[random.Next(10)]; appointment.StartTime = today.AddMonths(month).AddDays(random.Next(1, 28)).AddHours(random.Next(9, 18)); appointment.EndTime = appointment.StartTime.AddHours(2); this.calendarInlineEvents.Add(appointment); } } } } } /// <summary> /// Date time to string converter. /// </summary> public class DateTimeToStringConverter : IValueConverter { object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) { DateTime dateTime = Convert.ToDateTime(value); return dateTime.ToString("hh:mm tt"); } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }