You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:06:00