Xamarin中向SQLite文件保存时间信息时触发空引用异常的问题求助
解决SQLite保存时的NullReferenceException问题
你遇到的空引用错误,核心原因是BindingContext未正确初始化,还有几处绑定细节需要修正,咱们一步步来搞定:
1. 先修正XAML里的绑定错误
你的Time_End控件绑定写错了,把TimeStamp1改成TimeStamp2:
<TimePicker x:Name="Time_End" HorizontalOptions="Center" Time="{Binding TimeStamp2}" />
2. 初始化PopUp的BindingContext
当前PopUp的BindingContext是null,导致(TimeActivity)BindingContext触发空引用异常。在PopUp的后台代码构造函数里,给BindingContext赋值一个新的TimeActivity实例:
public YourPopUpClassName() // 替换成你的PopUp实际类名 { InitializeComponent(); // 初始化绑定上下文,确保能获取到TimeActivity实例 BindingContext = new TimeActivity(); }
3. 调整按钮点击事件的逻辑
因为绑定默认是双向的,控件的值会自动同步到BindingContext的实例里,你可以直接用这个实例保存,不需要手动拼接字符串。另外注意页面关闭逻辑不要重复:
async void Button_Clicked_2(object sender, EventArgs e) { // 用as转换更安全,避免强制转换抛出异常 var timeActivity = BindingContext as TimeActivity; if (timeActivity == null) return; // 把TimePicker的时间转换成带当日日期的字符串 timeActivity.TimeStamp1 = DateTime.Today.Add(Time_Start.Time).ToString(Time_Start.Format); timeActivity.TimeStamp2 = DateTime.Today.Add(Time_End.Time).ToString(Time_End.Format); // Editor的Text已经通过绑定同步到timeActivity.Text,无需手动获取 // 执行数据库保存 ActivityDatabase database = await ActivityDatabase.Instance; await database.SaveItemAsync(timeActivity); // 关闭PopUp即可,根据需求选择是否返回数据 Dismiss(timeActivity); // await Navigation.PopAsync(); // 如果PopUp是模态弹窗,用Dismiss就够了,不需要PopAsync }
4. 额外的安全优化
为了让代码更健壮,建议在数据库操作方法里加个空值检查:
public Task<int> SaveItemAsync(TimeActivity item) { if (item == null) return Task.FromResult(0); // 或者抛出明确异常,方便调试定位 if (item.ID != 0) { return Database.UpdateAsync(item); } else { return Database.InsertAsync(item); } }
这样修改后,空引用的问题就能解决,绑定逻辑也会更清晰可靠。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

