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>