Ich möchte in meinem DataGrid ein DataTemplate für meine Cells benutzen. Nur kann man daran (anscheinend) nicht dynamisch binden. Welche Möglichkeiten gibt es?
ItemSource des DataGrid ist eine ObservableCollection<EmployeeRota>:
class EmployeeRota : BaseViewModel
{
private Employee _employee;
public Employee employee
{
get { return _employee; }
set { _employee = value;
OnPropertyChanged(nameof(employee));
}
}
private ObservableCollection<Shift> _ListOfShifts;
public ObservableCollection<Shift> ListOfShifts
{
get { return _ListOfShifts; }
set { _ListOfShifts = value;
OnPropertyChanged(nameof(ListOfShifts));
}
}
}
Das erstellen der Spalten erfolgt dynamisch, da ListOfShifts 1 - x Elemente enthalten kann:
//Spalte für den Namen erstellen
DataGridTextColumn NameColumn = new DataGridTextColumn() { Header = "Name" };
Binding NamebindingExpression = new Binding($"employee.Name") { Mode = BindingMode.OneWay };
NameColumn.Binding = NamebindingExpression;
grdRota.Columns.Add(NameColumn);
//Spalten für die Schichten abhängig der Anzahl der Einträge erstellen
DataTemplate template = (DataTemplate)grdRota.FindResource("template");
int MaxColumn = vm.ListOfEmployeeRotas.Max(x => x.ListOfShifts.Count);
for (int i = 0; i < MaxColumn; i++)
{
DataGridTemplateColumn column = new DataGridTemplateColumn() { Header = vm.StartDate.AddDays(i).ToShortDateString(), CellTemplate = template };
grdRota.Columns.Add(column);
}
Das Template ist recht einfach:
<DataTemplate x:Key="template">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" Margin="10"/>
</StackPanel>
</DataTemplate>
Würde ich nun eine DataGridTextColumn statt der DataGridTemplateColumn nutzen, könnte ich mit
Binding bindingExpression = new Binding($"ListOfShifts[{i}]") { Mode = BindingMode.OneWay };
column.Binding = bindingExpression;
Also zusammen gefasst:
Jede Zelle/Spalte muss dynamisch an den entsprechenden Index einer ObservableCollection gebunden werden.
Mit DataGridTextColumn kein Problem, es muss aber DataGridTemplateColumn benutzt werden.
Ein Bonus wäre auch, wenn ich die Spalten im XAML erstellen könnte und dafür nicht extra im Code-Behind rumwurschteln müsste.
Danke schonmal im Vorraus!
Kriz