WPF datagrid作为用户控件

时间:2014-11-17 20:22:13

标签: wpf xaml mvvm datagrid

我需要有关绑定的帮助。它的WPF MVVM模式。我已经放置了一个数据网格和三个ICommand按钮' Add',' Modify',' Delete'按钮,在UserControl(UC)中。添加,修改,删除按钮是为了方便数据网格的操作。在XAML窗口(主窗口)中调用此UC 5次。按钮控件在主XAML窗口的视图模型中处理。例如,AddStudent for Add按钮,ModifyStudent for Modify按钮和DeleteStudent for Delete按钮。但是UC的所有5个实例只有一个处理程序。例如,单击UC的5个实例中的任何一个的Add按钮,它调用相同的AddStudent函数。

但问题是,5 UC实例必须绑定到5个不同的Student类,Engineering,Medical,Architecture等。

这是包含学生详细信息的学生实体。

因此,当我点击医学生数据网格的“添加”按钮时,会弹出一个对话框,要求提供应该添加到医学生数据网格中的学生详细信息。其他4个数据网格也是如此。所有这些都应该在视图模型中完成。但问题是,由于所有5个实例都调用相同的AddStudent方法,因此添加的新学生将反映在所有5个数据网格中。我希望能够将相应的学生列表绑定到其对应的数据网格控件。需要有关绑定的帮助。 PS:我已经将UC的ITemsSource作为依赖属性。

学生不是界面。它是一个实体类。

public class College 
{ 
    private string code; 
    private string name; 

    private Student engineering; 
    private Student medical;
    private Student nursing; 
    private Student architecture; 
    private Student fashionDesign; 

     public Student Engineering 
     { 
         get 
         { 
             return engineering;
         } 
         set 
         { 
            SetField(ref engineering, value, () => Engineering); 
         } 
     } 
 } 

学生是一个班级。不幸的是,我没有把它改成接口的自由。将这些中的每一个绑定到其对应的数据网格的任何其他方式。

1 个答案:

答案 0 :(得分:0)

你是如何写出大学课程的,看起来每个大学只能有一种类型的学生?肯定一所大学会有一整套学生,如果你被要求增加更多课程怎么办?你最终会到处都是网格而且一团糟。

我的建议是在学生班上添加一个StudentType(作为一个枚举)。

所以我的枚举:

public enum TypeOfStudent
{
    Engineering,
    Medical,
    Computing,
    Fashion     
}

将其作为属性添加到学生班:

public class Student
{
    public TypeOfStudent StudentType;

    //and other details as required...
}

然后,您只需要大学课程中的学生列表,并且只需要表单上的一组按钮。对于添加学生方法以了解您要添加的学生类型,然后在您要求学生信息的表单上添加一个简单的组合框,其中包含您的枚举值供用户选择可以工作。

public class College
{
    //property that contains ALL of the students
    public ObservableCollection<Student> Students

    //property containing the a filtered list of students. Your grid will bind its itemssource to
    //this property. You will need to set this property to equal students on initial load up so
    //it will display all students
    public IEnumerable<Student> FilteredStudents { get { return _filteredStudents; } }

    //property that returns the values in your enum which you can bind a combobox's itemsource to
    public IEnumerable<TypeOfStudent> StudentTypes
    {
        get { return Enum.GetValues(typeof(TypeOfStudent)).Cast<TypeOfStudent>(); }
    }

    //property that stores the selected student type which should be bound to a combobox's
    //selecteditem.
    public TypeOfStudent SelectedStudentType {  get; set + Raise PropertyChanged stuff;  }

    //property storing the selected filter for type of student
    public TypeOfStudent SelectedFilter {get; set + raise propertychanged; }

    //method for adding a student to your list of students
    public void AddStudent()
    {
        this.Students.Add(new Student
        {
            StudentType = this.SelectedStudentType
        });
    }

    //method of applying a filter
    public void FilterStudents()
    {
        _filteredStudents = this.Students.Where(s=>s.StudentType == this.SelectedFilter);
    }
}

至于让您的一个数据网格显示特定类型的学生。如果您为用户提供一个包含学生类型列表的组合框,那么当他们选择某些内容时,您可以使用过滤器学生方法来更新网格。

现在我遗漏了一些东西。例如,您可能希望过滤器中有某种​​“全部”选项。而且你需要在列表等上做一些提升属性改变的事件,但是我写的应该使整个事情更容易管理。