RadGridView Добавление динамических столбцов

Я пытаюсь объединить статические и динамические столбцы в моем RadGridView. Проблема в том, что динамический столбец представляет объект с различными свойствами, которые должны отображаться в одной ячейке.

Вот как я добавляю столбцы:

InitializeComponent();

        // Get some mock data
        ICollection <EmployeeRecord> employeeRecords = GetDummyData();

        this.grid.ItemsSource = employeeRecords;

        //Add the known columns
        this.grid.Columns.Add(new GridViewDataColumn() 
        { 
            UniqueName = "EmployeeName"
            , DataMemberBinding = new Binding("EmployeeName")
        });

        this.grid.Columns.Add(new GridViewDataColumn()
        {
            UniqueName = "ID"
            , DataMemberBinding = new Binding("ID")
        });


        // Now add the dynamic number of columns

        // Determines the maximum number of months that any employee has worked.
        int maxNumberOfMonths = employeeRecords.Max((x) => x.Subjects.Count);
        for (int i = 0; i < maxNumberOfMonths; i++)
        {
            this.grid.Columns.Add(new GridViewDataColumn()
            {
                UniqueName = "Subject " + (i + 1) ,
                DataMemberBinding = new Binding("Subjects[" + i + "]"),
                CellTemplate = this.Resources["SubjectTemplate"] as DataTemplate,
                DataType = typeof(Subject)
            });
        }

Шаблон данных для ячейки

    <DataTemplate x:Key="SubjectTemplate" DataType="ticket212220CreateGridColumnsOnTheFly:Subject">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <TextBlock Grid.Row="0" Grid.Column="0" Text="Subject"/>
            <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Name}"/>

            <TextBlock Grid.Row="1" Grid.Column="0" Text="Mark"/>
            <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Mark}"/>

        </Grid>
    </DataTemplate>

модель

 public class EmployeeRecord
{
    public string EmployeeName
    {
        get;
        set;
    }

    public int ID
    {
        get;
        set;
    }

    List<Subject> subjects = new List<Subject>();
    public IList<Subject> Subjects
    {
        get { return this.subjects; }
    }
}

public class Subject
{
    public string Name { get; set; }
    public int Mark { get;set; }
}

Генерация поддельных данных

      static ICollection<EmployeeRecord> GetDummyData()
    {
        ICollection<EmployeeRecord> employeeRecords = new List<EmployeeRecord>();

        EmployeeRecord stevie = new EmployeeRecord() { EmployeeName = "Steven Gerrard", ID = 333 };
        stevie.Subjects.Add(new Subject
        {
            Name = "Math",
            Mark = 5
        });

        employeeRecords.Add(stevie);

        EmployeeRecord ryan = new EmployeeRecord() { EmployeeName = "Ryan Giggs", ID = 222 };
        ryan.Subjects.Add(new Subject
        {
            Name = "Math",
            Mark = 5
        });
        ryan.Subjects.Add(new Subject
        {
            Name = "Geograph",
            Mark = 3
        });
        employeeRecords.Add(ryan);

        EmployeeRecord john = new EmployeeRecord() { EmployeeName = "John Terry", ID = 111 };
        john.Subjects.Add(new Subject
        {
            Name = "Math",
            Mark = 5
        });
        john.Subjects.Add(new Subject
        {
            Name = "Geograph",
            Mark = 3
        });
        john.Subjects.Add(new Subject
        {
            Name = "Physics",
            Mark = 7
        });
        employeeRecords.Add(john);

        return employeeRecords;
    }

Есть идеи, почему Имя и Марк не отображаются в ячейке?

1 ответ

Решение

DataContext клетки является EmployeeRecord объект, так как вы установили ItemsSource собственность на ICollection<EmployeeRecord>,

Если вы хотите отобразить все темы для сотрудника в столбце, вы можете использовать ItemsControl который связывает с Subjects коллекция EmployeeRecord:

<DataTemplate x:Key="SubjectTemplate" DataType="ticket212220CreateGridColumnsOnTheFly:Subject">
    <ItemsControl ItemsSource="{Binding Subjects}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Margin="0 3 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>

                    <TextBlock Grid.Row="0" Grid.Column="0" Text="Subject" FontWeight="Bold" Margin="0 0 5 0"/>
                    <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Name}"/>

                    <TextBlock Grid.Row="1" Grid.Column="0" Text="Mark" FontWeight="Bold" Margin="0 0 5 0"/>
                    <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Mark}"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</DataTemplate>
Другие вопросы по тегам