HierarchicalDataTemplate-GridControl


xaml

<Window.DataContext>
    <local:HierarchicalWindowViewModel/>
Window.DataContext>
<Window.Resources>
    <HierarchicalDataTemplate x:Key="gradetemp" DataType="{x:Type local:Grade}" ItemsSource="{Binding Students}">
        <dx:MeasurePixelSnapper>
            <StackPanel Orientation="Vertical">
                <Label Content="{Binding Row.GradeId}"/>
            StackPanel>
        dx:MeasurePixelSnapper>
    HierarchicalDataTemplate>
    <HierarchicalDataTemplate x:Key="stutemp" DataType="{x:Type local:Student}" ItemsSource="{Binding StuScore}">
        <dx:MeasurePixelSnapper>
            <StackPanel Orientation="Vertical">
                <Label Content="{Binding Row.StuName}"/>
            StackPanel>
        dx:MeasurePixelSnapper>
    HierarchicalDataTemplate>
    <HierarchicalDataTemplate x:Key="subtemp" DataType="{x:Type local:Subject}" ItemsSource="{Binding .}">
        <dx:MeasurePixelSnapper>
            <StackPanel Orientation="Horizontal">
                <Label Content="{Binding Row.Subj}"/>
                <Label Content="{Binding Row.Score}"/>
            StackPanel>
        dx:MeasurePixelSnapper>
    HierarchicalDataTemplate>

    <local:SpamRuleHierarchicalDataTemplateSelector x:Key="templateSelector" 
            GradeTemplate="{StaticResource gradetemp}" 
            StuTemplate="{StaticResource stutemp}" 
            SubTemplate="{StaticResource subtemp}" />
Window.Resources>
<Grid>
    <dxg:GridControl x:Name="treeList" ItemsSource="{Binding Grades}" >
        <dxg:GridControl.View>
            <dxg:TreeListView x:Name="view" TreeDerivationMode="HierarchicalDataTemplate"
                                DataRowTemplateSelector="{StaticResource templateSelector}"
                                AllowEditing="True" NavigationStyle="Cell" />
        dxg:GridControl.View>
    dxg:GridControl>
Grid>

model.cs

class HierarchicalWindowViewModel
{
    public List Grades { get; set; }

    public HierarchicalWindowViewModel()
    {
        Grades = new List();
        List students = new List();
        for (int i = 0; i < 20; i++)
        {
            students.Add(new Student
            {
                StuName = $"Name{i}",
                StuScore = new List
                {
                    new Subject{Subj = "math", Score = 66},
                    new Subject{Subj = "cs", Score = 77},
                }
            }); ;
        }

        for (int i = 0; i < 5; i++)
        {
            Grades.Add(new Grade
            {
                GradeId = $"Grade{i}",
                Students = students
            });
        }
    }
}

class Grade
{
    public string GradeId { get; set; }
    public List Students { get; set; }
}

class Student
{
    public string StuName { get; set; }
    public List StuScore { get; set; }
}

class Subject
{
    public string Subj { get; set; }
    public int Score { get; set; }
}

class SpamRuleHierarchicalDataTemplateSelector : DataTemplateSelector
{
    public HierarchicalDataTemplate GradeTemplate { get; set; }
    public HierarchicalDataTemplate StuTemplate { get; set; }
    public HierarchicalDataTemplate SubTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        RowData treeRowData = item as RowData;
        if (treeRowData == null || treeRowData.Row == null)
        {
            return null;
        }

        if (treeRowData.Row is Grade)
        {
            return GradeTemplate;
        }

        if (treeRowData.Row is Student)
        {
            return StuTemplate;
        }

        if (treeRowData.Row is Subject)
        {
            return SubTemplate;
        }

        return null;
    }
}
WPF