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时调用该方法更新列表:
- 在
HostOfficesVM中实现Refresh方法:
public void Refresh() { // 重新加载办公室列表的逻辑,比如从数据库或API获取最新数据 Offices = new ObservableCollection<Models.Office>(DBInstance.GetAllOffices()); // 触发PropertyChanged通知界面更新 OnPropertyChanged(nameof(Offices)); }
- 修改
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
相关产品推荐
相关产品推荐

