Xamarin Forms 编辑SQL存储条目后ObservableCollection不更新问题求助
问题修复方案
你代码里存在3个核心错误,按优先级修复即可解决问题:
1. 修复Item模型类的属性递归与赋值逻辑错误
你当前的Text、Description属性没有定义私有后备字段,get/set直接访问属性自身会触发无限递归,且赋值顺序完全颠倒,根本无法正常触发属性变更通知。
修复后的Item类代码:
public class Item : INotifyPropertyChanged { // 定义私有后备字段 private string _text; private string _description; private DateTime _dueDate; [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Text { get => _text; set { // 先判断值是否发生变化 if (_text == value) return; // 赋值给后备字段 _text = value; // 最后触发属性变更通知 OnPropertyChanged(nameof(Text)); } } public string Description { get => _description; set { if (_description == value) return; _description = value; OnPropertyChanged(nameof(Description)); } } public DateTime DueDate { get => _dueDate; set { if (_dueDate == value) return; _dueDate = value; OnPropertyChanged(nameof(DueDate)); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 修复保存逻辑的赋值错误
你当前OnSaveChanges方法里的Text = Text这类代码没有实际作用,没有把编辑后的内容同步到要保存的Item对象上,导致数据库更新的还是旧数据。
假设你详情页ViewModel的Text、Description、DueDate已经和Editor双向绑定拿到了编辑后的值,修复后的代码:
private async void OnSaveChanges(Item item) { // 把编辑后的值同步到要保存的item对象 item.Text = Text; item.Description = Description; item.DueDate = DueDate; await LocalDatabaseService.UpdateItem(item); await Shell.Current.GoToAsync(".."); }
3. 可选优化(非必要但建议)
你当前执行重新加载逻辑时是清空整个ObservableCollection再重新添加所有条目,性能较差,你可以改为只更新对应Id的条目,修改逻辑如下:
首先修改UpdateItem的事件触发逻辑,把更新后的item传出去:
// 先修改事件定义 public event Action<Item> OnUpdatedItem; public async Task UpdateItem(Item item) { var databasePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyData3.db"); var db = new SQLiteAsyncConnection(databasePath); await db.UpdateAsync(item); OnUpdatedItem?.Invoke(item); }
再修改事件回调逻辑:
private async void LocalDatabaseService_OnUpdatedItem(Item updatedItem) { // 查找集合里对应Id的已有条目 var existingItem = Items.FirstOrDefault(i => i.Id == updatedItem.Id); if (existingItem != null) { // 直接更新属性,因为已经实现了INotifyPropertyChanged,UI会自动同步 existingItem.Text = updatedItem.Text; existingItem.Description = updatedItem.Description; existingItem.DueDate = updatedItem.DueDate; } else { // 新条目直接添加 Items.Add(updatedItem); } }
修复完以上问题后,CollectionView就能正常同步更新后的内容了。
内容的提问来源于stack exchange,提问作者TinTan19
相关产品推荐
相关产品推荐

