Xamarin Forms中ObservableCollection更新后UI未刷新问题求助
Xamarin Forms CollectionView UI不刷新问题的原因及解决办法
问题原因
APIPatrolD类未实现属性变更通知:ObservableCollection<T>仅会在集合元素增删、整体替换时触发UI刷新,无法监听集合内单个对象的属性变化。你修改aPIPatrolD.patrold_remark时,UI无法感知到属性值的变更。- 手动触发集合的
PropertyChanged无效:OnPropertyChanged("DAPIPatrolDSiapImbasList")仅在集合引用改变时生效,而你只是修改了集合内部元素的属性,集合本身的引用未变,所以这个通知不会触发UI更新。
解决步骤
1. 让APIPatrolD实现INotifyPropertyChanged
修改APIPatrolD类,继承已实现INotifyPropertyChanged的BaseViewModel,将所有字段改为带属性变更通知的属性:
public class APIPatrolD : BaseViewModel { private string _patrold_ID; public string patrold_ID { get { return _patrold_ID; } set { _patrold_ID = value; OnPropertyChanged(); } } private string _patrold_loc; public string patrold_loc { get { return _patrold_loc; } set { _patrold_loc = value; OnPropertyChanged(); } } private int _patrold_seq; public int patrold_seq { get { return _patrold_seq; } set { _patrold_seq = value; OnPropertyChanged(); } } private string _patrold_desc; public string patrold_desc { get { return _patrold_desc; } set { _patrold_desc = value; OnPropertyChanged(); } } private byte[] _patrold_image; public byte[] patrold_image { get { return _patrold_image; } set { _patrold_image = value; OnPropertyChanged(); } } private string _patrold_GPS; public string patrold_GPS { get { return _patrold_GPS; } set { _patrold_GPS = value; OnPropertyChanged(); } } private string _patrold_takenGPS; public string patrold_takenGPS { get { return _patrold_takenGPS; } set { _patrold_takenGPS = value; OnPropertyChanged(); } } private DateTime _patrold_takenDateTime; public DateTime patrold_takenDateTime { get { return _patrold_takenDateTime; } set { _patrold_takenDateTime = value; OnPropertyChanged(); } } private string _patrold_remark; public string patrold_remark { get { return _patrold_remark; } set { _patrold_remark = value; OnPropertyChanged(); } } }
2. 优化按钮点击逻辑
不需要再遍历集合查找元素,直接修改传入的obj即可(obj就是集合中的实例,属性变更会自动通知UI):
private async void OnRemarksButtonClickedAsync(APIPatrolD obj) { var result = await App.Current.MainPage.Navigation.ShowPopupAsync(new CustomizePopups(obj)); obj.patrold_remark = (string)result; // 无需调用OnPropertyChanged("DAPIPatrolDSiapImbasList") }
3. 确认UI绑定
保持XAML中的绑定配置不变,patrold_remark现在会在值变化时自动触发UI更新。
内容的提问来源于stack exchange,提问作者XDfox
相关产品推荐
相关产品推荐

