ListView выдает UnhandledException, когда ScrollTo

У меня есть простая страница с таким ListView

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
   xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
   x:Class="ListViewDemo.MainPage">

   <StackLayout>
      <Grid>
         <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
         </Grid.ColumnDefinitions>
         <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
         </Grid.RowDefinitions>
         <Label Text="From" />
         <DatePicker x:Name="fromPicker" Grid.Row="1" />
         <Label Text="To" Grid.Column="1" />
         <DatePicker x:Name="toPicker" Grid.Column="1" Grid.Row="1" />
      </Grid>
      <ListView>
         <ListView.ItemTemplate>
            <DataTemplate>
               <ViewCell>
                  <StackLayout>
                     <Label Text="{Binding FromDate}" />
                     <Label Text="{Binding ToDate}" />
                  </StackLayout>
               </ViewCell>
            </DataTemplate>
         </ListView.ItemTemplate>
      </ListView>
   </StackLayout>

 </ContentPage>

Когда дата изменена, я хочу прокрутить до события, которое ближе всего к текущей дате, но я получаю UnhandledException, когда использую ScrollTo в UWP, а iOS просто не прокручивается.

Я думал об использовании ItemAppearing, но можно ли ему доверять, если в списке достаточно событий?

Если я использую await Task.Delay(500), я не получаю UnhandledException, вместо этого содержимое прыгает на моем экране.

Есть ли решение этой проблемы?

public void SetEvents(params CalenderEventDto[] events)
{
   var dateToScrollTo = DateTime.Now.Date;

   var scrollToEvent = events?.OrderBy(x => x.Start.Date)?.FirstOrDefault(c => c.Start.Date >= dateToScrollTo  || c.End.Date >= dateToScrollTo );

   var orderedEvents = events.GroupBy(x => x.Start.Date).OrderBy(x => x.Key);

   _calendarEvents.Clear();

   foreach (var groupedEvents in orderedEvents)
   {
      foreach (var calendarEvent in groupedEvents)
      {
         _calendarEvents.Add(calendarEvent);
      }
   }

   //await Task.Delay(450);
   Device.BeginInvokeOnMainThread(() => lstCalendar.ScrollTo(scrollToEvent, ScrollToPosition.Start, false));
}

EDIT
Я выяснил, что проблема и в iOS.


person Lasse Madsen    schedule 14.10.2016    source источник
comment
Необработанное исключение просто означает, что вы не поймали исключение - если бы вы это сделали, оно, вероятно, предоставило бы описание проблемы.   -  person C.Evenhuis    schedule 14.10.2016
comment
Я попытался окружить его попыткой поймать, но безуспешно.   -  person Lasse Madsen    schedule 14.10.2016
comment
Не используйте async void без крайней необходимости. Он предназначен для событий и методов, подобных событиям. Вы не можете перехватывать исключения из метода async void. На самом деле асинхронного кода вообще нет, поэтому удалите модификатор async или заставьте его возвращать Task, и вы сможете перехватить исключение.   -  person Krumelur    schedule 14.10.2016
comment
Я добавил улов внутри метода (кроме ScrollTo). Был использован async, когда я использовал Task.Delay   -  person Lasse Madsen    schedule 17.10.2016


Ответы (1)


Я понял, если я переместил SetEvents из конструктора в OnAppearing, он работает

person Lasse Madsen    schedule 19.10.2016