使用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; } } }
额外优化建议
- SQLite连接管理:用
using语句包裹连接,确保使用后自动释放资源,避免连接泄漏。 - 空值检查优化:用
!string.IsNullOrEmpty(Xname)代替Xname != null && Xname.Length > 0,更简洁健壮。 - 确认BindingContext:确保Page1的构造函数里正确设置了绑定上下文:
public Page1() { InitializeComponent(); BindingContext = new EnergyViewModel(); }
内容的提问来源于stack exchange,提问作者Behzad Changizi
相关产品推荐
相关产品推荐

