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

Xamarin.Forms添加OnAppearing后导航触发TargetInvocationException

问题根源

你遇到的异常本质是:添加OnAppearing方法后,页面绑定的HostOfficesVM实例和类成员hostofficesvm指向的实例不一致,导致选中办公室时,赋值给globalref.SelectedOffice的是旧VM里未被设置的SelectedOffice(值为null),最终EditOfficeVM加载时访问null对象的Location属性抛出空引用异常。

修复方案

方案1:同步更新类成员VM实例(快速修复)

修改OnAppearing方法,重建VM后同步更新类里的hostofficesvm变量,确保后续事件使用的是当前界面绑定的VM:

protected override void OnAppearing()
{
    base.OnAppearing();
    hostofficesvm = new ViewModels.HostOfficesVM();
    this.BindingContext = hostofficesvm;
}

方案2:复用现有VM并刷新数据(推荐)

避免频繁重建VM,在HostOfficesVM中添加刷新数据的方法,OnAppearing时调用该方法更新列表:

  1. 在HostOfficesVM中实现Refresh方法:
public void Refresh()
{
    // 重新加载办公室列表的逻辑,比如从数据库或API获取最新数据
    Offices = new ObservableCollection<Models.Office>(DBInstance.GetAllOffices());
    // 触发PropertyChanged通知界面更新
    OnPropertyChanged(nameof(Offices));
}
  1. 修改OnAppearing方法:
protected override void OnAppearing()
{
    base.OnAppearing();
    hostofficesvm.Refresh();
}

方案3:直接从事件参数获取选中项(更可靠)

不依赖VM的SelectedOffice,直接从SelectionChangedEventArgs中提取选中的办公室,避免VM实例不一致的问题:

private async void OfficesView_SelectionChanged(System.Object sender, Xamarin.Forms.SelectionChangedEventArgs e)
{
    // 直接从当前选中项获取Office实例
    if (e.CurrentSelection?.FirstOrDefault() is Models.Office selectedOffice)
    {
        globalref.SelectedOffice = selectedOffice;
        try
        {
            await Shell.Current.GoToAsync("EditOffice");
        }
        catch (Exception ex)
        {
            await DisplayAlert("Error", "An error occurred while navigating to the EditOffice page: " + ex.Message, "OK");
        }
        // 清空选中状态,防止重复触发事件
        ((ListView)sender).SelectedItem = null;
    }
}

额外防护:添加空值检查

在EditOfficeVM的LoadOffice方法中添加空值判断,提前处理未选中办公室的情况:

public void LoadOffice()
{
    Models.Office selectedOffice = globalref.SelectedOffice;
    if (selectedOffice == null)
    {
        // 可以抛出明确异常,或者自动返回上一页
        throw new InvalidOperationException("未选中要编辑的办公室");
    }
    Office_name = selectedOffice.Name;
    Location = selectedOffice.Location;
    Num_guests = selectedOffice.NumGuests;
    Sqft = selectedOffice.Sqft;
    Description = selectedOffice.Description;
    pricePerhour = selectedOffice.Hourly;
    MinHours = selectedOffice.MinHours;
    Amenities = selectedOffice.Amenities;
    Features = selectedOffice.Features;
}

内容的提问来源于stack exchange,提问作者Dennis Donkoh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:30:49