在我的Xamarin应用程序中,使用Xamarin Forms,我收到错误"适配器的内容已更改,但ListView未收到通知。确保不从后台线程修改适配器的内容,而只是从UI线程修改。"。
我正在使用Xamarin.Forms ListView来显示学生列表。当我进入添加学生页面并将学生添加到列表时,会抛出此错误。
ListView listView = new ListView
{
ItemsSource = register.StudentList,
ItemTemplate = cell // Set the ImageCell to the item template for the listview
};
// Set the content for the page.
Content = new StackLayout
{
Children = { header, listView }
};
以上代码来自注册页面,它是显示学生列表的地方。下面的代码来自AddStudent页面,这是学生被添加到注册表中的地方。
//Now add the new student to the register.
if(register != null)
{
register.addStudent(Student);
}
//After adding to the register, open up the page for this register.
Navigation.InsertPageBefore(new RegisterPage(register), Navigation.NavigationStack.First());
await Navigation.PopToRootAsync();
我实际上并没在代码中使用适配器,所以我不确定这个错误来自何处。我见过很多类似的问题似乎与Android适配器有关,但这是一个用Xamarin Forms制作的应用程序。
在这种情况下是否可以使用某种替代方案?
答案 0 :(得分:3)
正如您所说,register
对象是List
。因此,您绑定它的视图将永远不会收到有关内容更改的消息。
所以Jason在评论中询问register
是否是ObservableCollection
,为什么你会问自己。 ObservableCollection
实现INotifyCollectionChanged
,这意味着当绑定到视图时,视图现在可以订阅接口提供的事件。这个事件可以告诉它改变了什么。这可能是一个新项目被添加。已删除项目或更改了集合中的订单。
反过来,如果您想要更新集合中的项目,他们还必须实现INotifyPropertyChanged
,以便视图反映所做的更改。