如何将CRUD操作添加到WPF中的第二个实体

时间:2015-01-05 12:50:08

标签: c# wpf mvvm

我正在使用WPF程序,我使用EF和MVVM。我有两个实体:学生和成绩。每个学生可以有多个成绩。我有一个窗口和一个ViewModel(学生)。我可以使用该程序添加/更新/删除学生信息。当我从数据库中添加成绩时,我可以在屏幕上看到成绩。我不知道如何修改我的程序以使用户能够在该屏幕上输入,修改和删除成绩。你能给我一些提示或建议吗?我对新的架构建议持开放态度。我应该添加另一个用户控件或类似的东西吗?这是我的程序目前的样子。感谢。enter image description here

2 个答案:

答案 0 :(得分:1)

您应该添加另一个视图来升级成绩。我假设您熟悉如何切换视图和视图模型。

在第二个视图中,您应该添加一个ComboBox / ListBox。用学生表填充这个。

在你的xaml

<ComboBox ItemsSource={Binding Students} SelectedItem={Binding SelectedStudent} />

在您的视图模型中。

public ObservableCollection Students
{
    get { return DatabaseContext.Students.ToList(); }
}

当你在组合框中选择项目时,获得所选学生的成绩

private Student _selectedStudent;
public Student SelectedStudent
{
    get { return _selectedStudent; }
    set
    {
        _selectedStudent = value;
        GetGradesList();
    }
}

private void GetGradesList()
{
    var grades = DatabaseContext.Grades.Where(g => g.Student = SelectedStudent);
    // populate this to grid view like you have done in your current view.
    // And for selected row in the grid you will get values in your textboxes, update those values,
    // and then upgrade that to the database.
}

public void UpgradeGrade()
{
    var grade = DatabaseContext.Grades.FirstOrDefault(g => g == SelectedGrade);
    grade.Value = UpdatedValue;
    DatabaseContext.SaveChanges();
}

答案 1 :(得分:1)

你应该首先以一种很好的方式对视图模型进行建模(暂时忘记关于数据库的所有内容,这与viewmodels和amp; views无关):

public sealed class MainViewModel : INotifyPropertyChanged
{
    public ObservableCollection<StudentViewModel> Students {get; set;}
}

public sealed class StudentViewModel : INotifyPropertyChanged
{
    public ObservableCollection<GradeViewModel> Grades {get; set;}

    public StudentViewModel(){
        Grades = new ObservableCollection<GradeViewModel>();
    }
}

public sealed class GradeViewModel : INotifyPropertyChanged
{
    public string Name { get; set; }
    public int Value { get; set; }
}

一旦你很好地模仿了一切,你最终会在某个地方找到学生名单。