ItemSource が ViewModel の ObservableCollection 型のバインド可能なプロパティによってサポートされている ColectionView で構成される Xamarin フォーム プロジェクトがあります。ObservableCollection に新しいアイテムを追加すると NSInternalInconsistencyException がスローされますが、これも実際のデバイスでのみ発生しますが、シミュレーターでは正常に動作しています。また、すべてのアイテムが追加されるまで ItemSources 値を保持する新しいローカル パラメータを作成し、これを ItemSource バインド プロパティに割り当てることもできます。
ObservableCollection<ExploreUIDataSet> _exploreDataList = new ObservableCollection<ExploreUIDataSet>();
public ObservableCollection<ExploreUIDataSet> ExploreDataList
{
get { return _exploreDataList; }
set { _exploreDataList = value; OnPropertyChanged(nameof(ExploreDataList)); }
}
ExploreDataList.Add() は NSInternalInconsistencyException をスローします。ローカル変数を作成し、それにすべての値を追加して、ExploreDataList に割り当て直すことは正常に機能しています。ネイティブ ios プロジェクトでは、バッチ更新によってソースのこのような変更を処理していました。しかし、特に CollectionView が監視可能なコレクションによってサポートされている場合は、フォームでそれを行う必要があります。また、ObservableCollection に新しいアイテムを追加する場合でも、ExploreDataList として BindabLayout.itemsource を使用して Stacklayout を使用すると機能します。
つまり、以下のコードが機能します
<StackLayout Spacing="{DynamicResource Spacing10}"
Padding="{DynamicResource ExploreMainStkPadding}"
BindableLayout.ItemsSource="{Binding ExploreDataList}"
BindableLayout.ItemTemplateSelector="{DynamicResource ExploreSelector}">
</StackLayout>
以下のCollectionViewコードは失敗します
<CollectionView VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand" ItemsSource="{Binding ExploreDataList}" ItemTemplate="{DynamicResource ExploreSelector}"/>