2017-08-03 57 views
4

我一直在爲這個異常(以及隨後的硬件崩潰)奮戰了大約一天。 Xamarin Forms中有一個ListView,它可以對頁眉進行分組。儘管我可以從Call Stack中收集,但由於分組而發生錯誤。我通過從ListView中移除分組來驗證這一點,並且應用程序顯示數據而不會崩潰。我甚至在幾周內將代碼區分開來,沒有什麼突出的。 這也只發生在新推出時,隨後的推出不會引發此異常或崩潰。Xamarin Forms - 有序列表和參數OutOfRange

如何進一步調試和解決此問題?

Exception stack trace

列表視圖XAML

<ListView x:Name="ListViewItems" 
      ItemsSource="{Binding ItemsGrouped}" 
      GroupDisplayBinding="{Binding Key.DisplayText}" 
      IsGroupingEnabled="true"> 
    <ListView.GroupHeaderTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <cells:MyGroupHeaderView/> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.GroupHeaderTemplate> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <cells:ItemCellView /> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

MyGroupHeaderView XAML

<StackLayout VerticalOptions="Center"> 
    <Label Text="{Binding Key.DisplayText}"> 
    </Label> 
</StackLayout> 

分組C#代碼

var result = from s in myItems 
    orderby s.ItemDateTime 
    group s by s.GetSortGroupInfo() 
    into itemGroup 
    select new Grouping<GroupInfo, ItemViewModel>(itemGroup.Key, itemGroup); 

的GroupInfo類(用於排序和顯示)

public class GroupInfo 
{ 
    public string DisplayText { get; set; } 

    public int SortValue { get; set; } 
} 

綁定屬性和Setter

public ObservableRangeCollection<Grouping<GroupInfo, ItemViewModel>> ItemsGrouped { get; } 
    = new ObservableRangeCollection<Grouping<GroupInfo, StopViewModel>>(); 

this.ItemsGrouped.ReplaceRange(
    this.MyItems.GroupByDate() 
     .OrderBy(f => f.Key.SortValue) 
     .ToList()); 

回答

0

我發現了這個問題。當我將James Montemagno的Xam.Plugin.Geolocator從3.04更新到4.01時,它也從PCL切換到.NET Standard。當我回滾時,ListView分組再次運行。不幸的是,我不能讓GeoLocation與3.04一起工作,不管怎樣,在所有的事情上,我都遇到了4.01的上述錯誤。

1

根本的問題是,TemplatedItemsList不處理由replaceRange產生井Reset

作爲一個短期的解決方法,您可以通過不使用ReplaceRange避免碰撞:

ItemsGrouped.Clear(); 
foreach (var item in MyItems.GroupByDate().OrderBy(f => f.Key.SortValue)) 
{ 
    ItemsGrouped.Add(item); 
} 

或者設置caching strategy回收:

<ListView x:Name="ListViewItems" 
     ItemsSource="{Binding ItemsGrouped}" 
     IsGroupingEnabled="true" 
     CachingStrategy="RecycleElement"> 

有趣的是,如果你遵循調用鏈你來到UnhookItem它有這樣的評論:

//Hack: the cell could still be visible on iOS because the cells are reloaded after this unhook 
//this causes some visual updates caused by a null datacontext and default values like IsVisible 
if (Device.RuntimePlatform == Device.iOS && CachingStrategy == ListViewCachingStrategy.RetainElement) 
    await Task.Delay(100); 
item.BindingContext = null; 

對我來說崩潰看起來是由於嘗試重新呈現模板,因爲綁定上下文已經改變...所以也許這個破解也適用於Android ...

您正在設置GroupDisplayBinding和上面的示例代碼中的GroupHeaderTemplate ...我假設因爲您正在嘗試...您應該每次只有一個設置...使用GroupDisplayBinding也可以避免我期望的問題。

+0

我更換了ReplaceRange,取出了GroupDisplayBinding,並添加了CachingStrategy,但仍然崩潰。我可以調試並逐步通過我們所有的代碼,而不會造成問異常似乎在渲染上發生。 –

+0

您可以發佈一個完整的最小獨立示例。我能夠重現您的錯誤,但無法重現緩存策略回收時,或不使用ReplaceRange時。 – Damian