我有一个 Xamarin 表单项目,它由一个 ColectionView 组成,其 ItemSource 由 ViewModel 中的 ObservableCollection 类型的可绑定属性支持。向 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 中,也可以使用带有 BindabLayout.itemsource 的 Stacklayout 作为 ExploreDataList。
即下面的代码有效
<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}"/>