c# - 基于集合的动态 Datagrid 列

标签 c# wpf mvvm window

例如,我有一个包装器。

public class Student{
       public string Name{get;set}
       public int IDNumber{get;set;}
       public ObservableCollection<SubjectWrapper> Subjects{get;set;}

}
public class SubjectWrapper{
       public string SubjectName{get;set;}
       public bool IsSubjectSelected{get;set;}
}

我怎样才能有效地将它绑定(bind)到 Datagrid。可能有任意数量的主题。所有学生都将拥有所有主题列反对那里的名称。请看下图。我也想遵循 MVVM 模式(后面的代码更少)。

UI Mock up

最佳答案

enter image description here

XAML

    public partial class MainWindow : Window {
        public MainWindow()
        {
            InitializeComponent();

            var student = new Student(){ Name = "Ebin"};
            student.Subjects.Add(new SubjectWrapper() { SubjectName="subject1",IsSubjectSelected=true });
            student.Subjects.Add(new SubjectWrapper(){ SubjectName = "subject2", IsSubjectSelected = false});

            var student2 = new Student() { Name = "Ravi" };
            student2.Subjects.Add(new SubjectWrapper() { SubjectName = "subject1", IsSubjectSelected = false });
            student2.Subjects.Add(new SubjectWrapper() { SubjectName = "subject2", IsSubjectSelected = true });


            var list = new List<Student>();
            list.Add(student);
            list.Add(student2);

//Name column adding
            maingrid.Columns.Add(new DataGridTextColumn(){ Header = "name", Binding = new Binding("Name")});

//Subject columns added dynamically
            for (int i = 0; i < list[0].Subjects.Count(); i++) {

                var col = new DataGridCheckBoxColumn();
                col.Header = list[0].Subjects[i].SubjectName;
                col.Binding = new Binding("Subjects[" + i.ToString() + "].IsSubjectSelected");
                maingrid.Columns.Add(col);
            }

            maingrid.ItemsSource = list;


        }
    }



    public class Student
    {
        public string Name { get; set; }
        public int IDNumber { get; set; }
        public ObservableCollection<SubjectWrapper> Subjects { get; set; }

        public Student()
        {
            Subjects = new ObservableCollection<WpfApplication1.SubjectWrapper>();

        }
    }
    public class SubjectWrapper {
        public string SubjectName { get; set; }
        public bool IsSubjectSelected { get; set; }
    }

关于c# - 基于集合的动态 Datagrid 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425380/

相关文章:

c# - 将 using 子句添加到项目中 - 初学者

.net - 奇怪的断断续续的 WPF 动画

wpf - 与 PRISM 的对话交互请求

wpf - 在WPF中为ViewModel中的命令分配快捷键

C# 自动清除 Winform 文本框

c# - 从 CLSID 动态加载 ActiveX 控件

wpf - 禁用对 WPF Telerik RadGrid 行的关注

c# - 如何获取记事本文件保存位置

wpf - Prism中的MVVM多个 View 相同的ViewModel

c# - 获取专辑封面,如 JPEG、PNG 等