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

UWP应用中学生-科目关联关系实现方案咨询

Hey there! Let me walk you through how to tackle this UWP task step by step, including core code snippets you can adapt directly.

实现UWP学生-科目关联展示方案

1. 定义数据模型与数据库上下文

We'll use Entity Framework Core to handle database operations first. Here are the entity classes and context setup:

// Student实体
public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    // 导航属性:关联的学生-科目记录
    public ICollection<StudentSubject> StudentSubjects { get; set; }
}

// Subject实体
public class Subject
{
    public int Id { get; set; }
    public string SubjectName { get; set; }
    // 导航属性:关联的学生-科目记录
    public ICollection<StudentSubject> StudentSubjects { get; set; }
}

// 桥接表实体
public class StudentSubject
{
    public int StudentId { get; set; }
    public Student Student { get; set; }
    public int SubjectId { get; set; }
    public Subject Subject { get; set; }
}

// 数据库上下文
public class SchoolDbContext : DbContext
{
    public DbSet<Student> Students { get; set; }
    public DbSet<Subject> Subjects { get; set; }
    public DbSet<StudentSubject> StudentSubjects { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 配置本地SQLite数据库,可替换为其他数据库类型
        optionsBuilder.UseSqlite("Data Source=SchoolDatabase.db");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 配置桥接表的复合主键
        modelBuilder.Entity<StudentSubject>()
            .HasKey(ss => new { ss.StudentId, ss.SubjectId });

        // 配置Student与StudentSubject的一对多关系
        modelBuilder.Entity<StudentSubject>()
            .HasOne(ss => ss.Student)
            .WithMany(s => s.StudentSubjects)
            .HasForeignKey(ss => ss.StudentId);

        // 配置Subject与StudentSubject的一对多关系
        modelBuilder.Entity<StudentSubject>()
            .HasOne(ss => ss.Subject)
            .WithMany(s => s.StudentSubjects)
            .HasForeignKey(ss => ss.SubjectId);
    }
}

2. 主页面:展示学生列表

The main page uses a ListView to display students and handles navigation to the details page on click:

XAML代码(MainPage.xaml)

<Grid>
    <ListView x:Name="StudentsListView" 
              ItemClick="StudentsListView_ItemClick"
              IsItemClickEnabled="True">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" FontSize="18" Margin="10"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

后台代码(MainPage.xaml.cs)

public sealed partial class MainPage : Page
{
    private SchoolDbContext _dbContext;

    public MainPage()
    {
        this.InitializeComponent();
        _dbContext = new SchoolDbContext();
        // 确保数据库已初始化创建
        _dbContext.Database.EnsureCreated();
        LoadStudents();
    }

    private async void LoadStudents()
    {
        // 异步加载所有学生数据
        var students = await _dbContext.Students.ToListAsync();
        StudentsListView.ItemsSource = students;
    }

    private void StudentsListView_ItemClick(object sender, ItemClickEventArgs e)
    {
        var selectedStudent = e.ClickedItem as Student;
        if (selectedStudent != null)
        {
            // 导航到详情页,传递学生ID作为参数(比传整个对象更高效)
            Frame.Navigate(typeof(StudentSubjectsPage), selectedStudent.Id);
        }
    }
}

3. 详情页面:展示学生关联的科目

Create a StudentSubjectsPage to receive the student ID and query their related subjects:

XAML代码(StudentSubjectsPage.xaml)

<Grid>
    <ListView x:Name="SubjectsListView">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding SubjectName}" FontSize="18" Margin="10"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

后台代码(StudentSubjectsPage.xaml.cs)

public sealed partial class StudentSubjectsPage : Page
{
    private SchoolDbContext _dbContext;

    public StudentSubjectsPage()
    {
        this.InitializeComponent();
        _dbContext = new SchoolDbContext();
    }

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        if (e.Parameter is int studentId)
        {
            // 查询该学生关联的所有科目(使用Include加载关联数据,避免延迟加载问题)
            var studentSubjects = await _dbContext.StudentSubjects
                .Include(ss => ss.Subject)
                .Where(ss => ss.StudentId == studentId)
                .ToListAsync();

            // 提取科目列表并绑定到ListView
            var subjects = studentSubjects.Select(ss => ss.Subject).ToList();
            SubjectsListView.ItemsSource = subjects;
        }
    }
}

关键注意事项

  • Make sure to install required NuGet packages: Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.Sqlite, Microsoft.EntityFrameworkCore.Tools
  • Passing the student ID instead of the full object avoids serialization issues and is more efficient
  • Using Include ensures related subject data is loaded in a single query, preventing performance hits from lazy loading

内容的提问来源于stack exchange,提问作者hmak.soft

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:04:14