Xamarin点击新增课程触发System.Reflection.TargetInvocationException报错求解
问题根因与修复方案
System.Reflection.TargetInvocationException属于反射调用的包装异常,实际错误需要查看该异常的InnerException属性定位,结合你提供的代码,当前存在以下明确错误:
1. 新增课程页绑定属性缺失(核心报错原因)
AddNewCoursePage.xaml中绑定了InstructorFirstName、InstructorLastName、Notes、CourseStartDate、CourseEndDate、AssessmentType共6个属性,但你的AddNewCourseModel中仅实现了CourseName,XAML绑定尝试访问不存在的属性时触发异常,直接导致页面初始化失败。
修复方式:在AddNewCourseModel中补全所有绑定属性的定义:
private string _instructorFirstName; public string InstructorFirstName { get => _instructorFirstName; set => SetProperty(ref _instructorFirstName, value); } private string _instructorLastName; public string InstructorLastName { get => _instructorLastName; set => SetProperty(ref _instructorLastName, value); } private string _notes; public string Notes { get => _notes; set => SetProperty(ref _notes, value); } private DateTime _courseStartDate = DateTime.Now; public DateTime CourseStartDate { get => _courseStartDate; set => SetProperty(ref _courseStartDate, value); } private DateTime _courseEndDate = DateTime.Now.AddDays(30); public DateTime CourseEndDate { get => _courseEndDate; set => SetProperty(ref _courseEndDate, value); } private string _assessmentType; public string AssessmentType { get => _assessmentType; set => SetProperty(ref _assessmentType, value); }
同时修改AddNewCoursePage.xaml中的Picker配置,补充选中值绑定,删除无效的BindingContext声明:
<Picker SelectedItem="{Binding AssessmentType}"> <Picker.Items> <x:String>Objective</x:String> <x:String>Performance</x:String> </Picker.Items> </Picker>
2. 课程列表页绑定错误
CoursesPage.xaml中ListView的ItemsSource绑定值写为Course,但CoursesModel中对应的集合属性名为AllCourses,名称不匹配会导致列表无法正常加载数据。
修复方式:修改绑定属性名:
<ListView BackgroundColor="Transparent" CachingStrategy="RecycleElement" HasUnevenRows="True" IsPullToRefreshEnabled="True" ItemsSource="{Binding AllCourses}" IsRefreshing="{Binding IsBusy, Mode=OneWay}" RefreshCommand="{Binding RefreshCommand}" RefreshControlColor="Red" SelectionMode="None" SeparatorVisibility="None">
3. 导航逻辑优化
当前你在新增/取消操作后返回课程页使用的是硬编码的相对路径,容易因为路由层级不匹配触发导航错误,建议统一使用返回上一页的写法,更稳定也无需硬编码页面名称:
async Task AddCourse() { var course = new Course() { CourseName = CourseName, InstructorFirstName = InstructorFirstName, InstructorLastName = InstructorLastName, Notes = Notes, CourseStartDate = CourseStartDate, CourseEndDate = CourseEndDate, AssessmentType = AssessmentType }; await CourseService.AddCourse(course); // 直接返回上一级页面 await Shell.Current.GoToAsync(".."); } async Task Cancel() { await Shell.Current.GoToAsync(".."); }
另外需要确认AppShell.xaml中已经将CoursesPage设置为默认显示的Shell内容:
<ShellItem> <ShellContent ContentTemplate="{DataTemplate views:CoursesPage}"/> </ShellItem>
通用排查技巧
如果修改后仍然有异常,可以在导航方法中添加try-catch捕获异常,查看InnerException的详细信息即可直接定位具体错误点:
async Task NavigateToAddNewCoursePage() { try { await Shell.Current.GoToAsync(nameof(AddNewCoursePage)); } catch (Exception ex) { // 打断点查看ex.InnerException的具体内容 System.Diagnostics.Debug.WriteLine(ex.ToString()); } }
内容的提问来源于stack exchange,提问作者Evan

