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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:15:07