Xamarinのシェルテンプレートから開発を開始し、最初にあるListViewをCollectionViewに変えたら全くリストが表示されなくなった。
環境
- Xamarin.Forms 4.1.0.581479
問題の事象
CollectionViewが表示されるべき場所に何も表示されず、コンソールに以下のようなエラーが出ている。
Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInternalInconsistencyException Reason: Invalid update: invalid number of items in section 0. The number of items contained in an existing section after the update (1) must be equal to the number of items contained in that section before the update (1), plus or minus the number of items inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).
Native stack trace:
0 CoreFoundation 0x00000001155686fb __exceptionPreprocess + 331
1 libobjc.A.dylib 0x00000001160eaac5 objc_exception_throw + 48
2 CoreFoundation 0x0000000115568482 +[NSException raise:format:arguments:] + 98
・・・
問題が起きる実装
Viewはシェルテンプレートで作られるItemPage.xamlを改修
ListViewからCollectionViewへ
<CollectionView
x:Name="ItemsListView"
ItemsSource="{Binding Items}"
VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand"
>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
・・・
ViewModel側はシェルテンプレートで作られるItemsViewModelそのまま。
ItemSourceのデータは以下で作られている。
Items.Clear();
var items = await DataStore.GetItemsAsync(true);
foreach (var item in items)
{
Items.Add(item);
}
・・・
原因
CollectionView.ItemSourceにバインドされているコレクションがResetされた時の動きがバグってる。
(ObservableCollectionをClearした時の動きがバグってる。)
対応
とりあえずItems.Clear()
をコメントアウトしたら回避はできる。
Clearできないけど・・・
IssueはCloseされてるのでそのうちリリースされるでしょう。