Xamarin使用ObservableCollection替代List时DataTemplate不显示数据如何排查
问题根源
- 构造函数里调用
BindableLayout.SetItemsSource(stackLayout, _vm.ListOfText)的写法,只是把当时ListOfText的取值当值传进去,根本没有建立对ListOfText属性的绑定关系。
构造函数执行时,OnAppearing还没触发,ListOfText此时取值为null,所以BindableLayout拿到的数据源是空引用。等你在OnAppearing里给ListOfText赋值新的ObservableCollection实例时,之前塞给BindableLayout的那个空引用根本不会变化,UI自然不会渲染任何内容。 - 之前用List作为数据源时能正常运行,是因为旧实现大概率在ViewModel初始化阶段就给ListOfText建好了空List实例,构造函数执行时拿到的是这个已经存在的List引用,后续往List里加数据的时候引用没有变化,所以UI能正常刷新。现在你是直接在OnAppearing里给ListOfText换了个全新的ObservableCollection实例,因为没有建立属性绑定,UI完全感知不到你替换了新的集合。
修复方式
- 把直接传值的数据源设置方式改成正式绑定,让UI可以接收到ListOfText的属性变更通知:
原代码:
替换为绑定写法:BindableLayout.SetItemsSource(stackLayout, _vm.ListOfText);
修改之后无论你在什么时机给ListOfText赋新值、通过SetProperty触发属性变更通知,UI都会自动获取最新的集合引用完成渲染。stackLayout.SetBinding(BindableLayout.ItemsSourceProperty, nameof(YourPageViewModel.ListOfText)); - 可选优化:没必要每次OnAppearing都新建一个ObservableCollection实例,可以在ViewModel初始化阶段就把集合实例建好,后续加载数据直接往集合里执行Add/修改元素操作,靠ObservableCollection自带的集合变更通知刷新UI,性能更好也更符合该类型的设计初衷。
内容的提问来源于stack exchange,提问作者Janice_Feb_1998
相关产品推荐
相关产品推荐

