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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:57:32