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

使用SQL与ViewModel实现数据添加保存后列表为空的问题排查请求

问题排查与解决方案

我帮你梳理了代码里的问题,核心原因是集合更新没有通知UI,再加上一些SQLite连接管理的细节,导致列表始终为空。下面分步骤给你解决:

核心问题:ObservableCollection更新未触发UI刷新

你在AddX方法里直接重新创建了ObservableCollection:

energyX = new ObservableCollection<EnergyX>(conn.Table<EnergyX>().ToList());

但你的ViewModel没有实现INotifyPropertyChanged接口,energyX是自动属性——当你替换整个集合引用时,UI绑定的还是最初的空集合实例,自然看不到新数据。

快速修复(无需改动接口)

不用重新创建集合,而是清空现有集合再添加数据,这样UI能感知到集合内容的变化:

public void AddX()
{
    if (!string.IsNullOrEmpty(Xname))
    {
        EnergyX XX = new EnergyX();
        XX.xray = Xname;
        // 使用using确保SQLite连接自动释放
        using(var conn = GetSQLiteConnection()) 
        {
            conn.CreateTable<EnergyX>();
            var resultX = conn.Insert(XX);
            // 先清空旧数据,再加载新数据
            energyX.Clear();
            var dataList = conn.Table<EnergyX>().ToList();
            foreach(var item in dataList)
            {
                energyX.Add(item);
            }
        }
        // 清空输入框,提升用户体验
        Xname = string.Empty;
    }
}

更规范的长期方案:实现INotifyPropertyChanged

如果后续需要更多属性通知UI的场景,建议让ViewModel实现INotifyPropertyChanged接口,这样任何属性(包括集合)的变化都能自动通知UI:

修改后的完整ViewModel代码

using System.ComponentModel;
using System.Runtime.CompilerServices;
using Xamarin.Forms;

public class EnergyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ObservableCollection<EnergyX> _energyX = new ObservableCollection<EnergyX>();
    public ObservableCollection<EnergyX> energyX 
    {
        get => _energyX;
        set
        {
            _energyX = value;
            OnPropertyChanged();
        }
    }

    private string _xname;
    public string Xname 
    {
        get => _xname;
        set
        {
            _xname = value;
            OnPropertyChanged();
        }
    }

    public ICommand AddXrayCommand => new Command(AddX);

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public SQLiteConnection GetSQLiteConnection()
    {
        var fileName = "Energys.db";
        var documentPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);
        var path = Path.Combine(documentPath, fileName);
        return new SQLiteConnection(path);
    }

    public void AddX()
    {
        if (!string.IsNullOrEmpty(Xname))
        {
            EnergyX XX = new EnergyX();
            XX.xray = Xname;
            using(var conn = GetSQLiteConnection())
            {
                conn.CreateTable<EnergyX>();
                var resultX = conn.Insert(XX);
                // 现在重新赋值集合也能通知UI了
                energyX = new ObservableCollection<EnergyX>(conn.Table<EnergyX>().ToList());
            }
            Xname = string.Empty;
        }
    }
}

额外优化建议

  1. SQLite连接管理:用using语句包裹连接,确保使用后自动释放资源,避免连接泄漏。
  2. 空值检查优化:用!string.IsNullOrEmpty(Xname)代替Xname != null && Xname.Length > 0,更简洁健壮。
  3. 确认BindingContext:确保Page1的构造函数里正确设置了绑定上下文:
    public Page1()
    {
        InitializeComponent();
        BindingContext = new EnergyViewModel();
    }
    

内容的提问来源于stack exchange,提问作者Behzad Changizi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:57:38