Я напишу пример для вас, чтобы показать, какую модель и данные вам нужно для отображения сгруппированного списка в вашем случае:
Модель и данные должны быть примерно такими:
public partial class MainPage : ContentPage
{
public ObservableCollection<EventsHB> AllItems { get; set; }
public MainPage()
{
InitializeComponent();
AllItems = new ObservableCollection<EventsHB>();
var julyGroup = new EventsHB() {month = "july"};
julyGroup.Add(new EventTO() { calendarEventId = "1", title = "firstTitle", startDate = "01-1-1", startTime = "01-1-1"});
julyGroup.Add(new EventTO() { calendarEventId = "2", title = "secondTitle", startDate = "02-1-1", startTime = "01-1-2" });
julyGroup.Add(new EventTO() { calendarEventId = "3", title = "thirdTitle", startDate = "02-1-1", startTime = "01-1-3" });
julyGroup.Add(new EventTO() { calendarEventId = "4", title = "fourthTitle", startDate = "02-1-1", startTime = "01-1-4" });
var juneGroup = new EventsHB() { month = "june" };
juneGroup.Add(new EventTO() { calendarEventId = "1", title = "junefirstTitle", startDate = "01-1-1", startTime = "01-1-1" });
juneGroup.Add(new EventTO() { calendarEventId = "2", title = "junesecondTitle", startDate = "02-1-1", startTime = "01-1-2" });
juneGroup.Add(new EventTO() { calendarEventId = "3", title = "junethirdTitle", startDate = "02-1-1", startTime = "01-1-3" });
juneGroup.Add(new EventTO() { calendarEventId = "4", title = "junefourthTitle", startDate = "02-1-1", startTime = "01-1-4" });
AllItems.Add(julyGroup);
AllItems.Add(juneGroup);
//...
//more months like April,May can be added
BindingContext = this;
}
}
public class EventsHB : ObservableCollection<EventTO>
{
public string month { get; set; }
public EventTO eventTO { get; set; }
}
public class EventTO
{
public string calendarEventId { get; set; }
public string title { get; set; }
public string startDate { get; set; }
public string startTime { get; set; }
}
И в ваших данных json, структура данных, кажется, не соответствует структуре, которую я перечислил в моем примере, поэтому вам нужно преобразовать ваши данные в правильную структуру, я пишу тестовую функцию, и вы можете проверить, если она работы:
//A test function to convert you json array to the array we need
void test()
{
EventsHB julyGroup = new EventsHB() { month = "july" }; ;
EventsHB juneGroup = new EventsHB() { month = "june" };
//other months group
foreach (var item in AllItems)
{
EventsHB hb = item;
if (hb.month == "july")
{
julyGroup.Add(hb.eventTO);
}
else if (hb.month == "june")
{
juneGroup.Add(hb.eventTO);
}//...other months
}
//at last, add them to All items.
AllItems.Add(julyGroup);
AllItems.Add(juneGroup);
//...add other months
}
Вы можете конвертировать его по-своему.
Пример здесь: grouped-listView
См .: customizing-list-внешний вид # группировка
Обновление:
Действительно сложно преобразовать структуру данных на стороне приложения, я конвертирую ее для вас и добавляю комментарии каждый раз, когда обновляю код в проекте.
Причина, по которой вы получаете исключение, заключается в том, что модель EventsHB : ObservableCollection<EventTO>
, поэтому я создаю новую здесь для десериализации json.
public class CalendarEvents
{
//update here: here should be List<EventsHBTwo>
public List<EventsHBTwo> eventsHB { get; set; }
}
//update use this one to shou grouped list data
public class EventsHB : ObservableCollection<EventTO>
{
public string month { get; set; }
public EventTO eventTO { get; set; }
}
//Update: use this one to deserialize json
public class EventsHBTwo
{
public string month { get; set; }
public EventTO eventTO { get; set; }
}
В ViewModel.cs:
//Update: add a new tempItem to get json data
public ObservableCollection<EventsHBTwo> tempItem
{
get
{
return _tempItems;
}
set
{
_tempItems = value;
OnPropertyChanged("tempItem");
}
}
И затем использовать этот tempItem для получения данных JSON:
tempItem = new ObservableCollection<EventsHBTwo>(myevents.eventsHB);
//update: converData here
converData(tempItem);
И функция преобразования:
public void converData(ObservableCollection<EventsHBTwo> allItem)
{
AllItems = new ObservableCollection<EventsHB>();
EventsHB julyGroup = new EventsHB() { month = "July" };
EventsHB juneGroup = new EventsHB() { month = "June" };
foreach (var item in allItem)
{
EventsHBTwo hb = item;
if (hb.month == "July")
{
julyGroup.Add(hb.eventTO);
}
else if (hb.month == "June")
{
juneGroup.Add(hb.eventTO);
}
}
//at last, add them to All items.
AllItems.Add(julyGroup);
AllItems.Add(juneGroup);
}
Последний в xaml, добавьте IsGroupingEnabled GroupShortNameBinding GroupDisplayBinding здесь:
<ListView x:Name="MyEventsListview"
RefreshCommand="{Binding RefreshCommand}"
IsRefreshing="{Binding IsRefreshing}"
IsPullToRefreshEnabled="True"
HasUnevenRows="True"
ItemsSource="{Binding AllItems,Mode=TwoWay}"
BackgroundColor="White"
IsGroupingEnabled="True"
GroupDisplayBinding="{Binding month}"
GroupShortNameBinding="{Binding month}">
И используйте startDate startTime напрямую вместо eventTO.startDate.
Я загрузил свой образец здесь, и вы можете проверить его: working-grouped-listView-xamarin.forms
Лучший способ добиться этого - попросить службу поддержки дать вам json, например:
{"eventsHB":
{july:[
{"eventTO":{"calendarEventId":135,}}
{"eventTO":{"calendarEventId":135,}}
{"eventTO":{"calendarEventId":135,}}
{"eventTO":{"calendarEventId":135,}}
}
{june:[
{"eventTO":{"calendarEventId":135,}}
{"eventTO":{"calendarEventId":135,}}
{"eventTO":{"calendarEventId":135,}}
{"eventTO":{"calendarEventId":135,}}
]
}
...
}