Cela me rend fou. Je crée un DataGrid dans du code, puis je le lie à un datatable. C'est dynamique et les lignes et les colonnes seront différentes chaque fois que la grille est créée.WPF DataGrid Liaison à datable
En fait, je boucle à travers mes DataTable et créer des colonnes DataGrid pour chaque colonne, comme ceci:
private static void CreateDataGridColumns(DataGrid datagrid, Document doc)
{
if (doc == null) return; //return
datagrid.Columns.Clear();
foreach (var item in doc.Keys)
{
var column = new DataGridTemplateColumn
{
Header = item,
CellTemplateSelector = new CustomRowDataTemplateSelector(),
};
datagrid.Columns.Add(column);
}
}
Comme vous pouvez le voir, je me sers d'un sélecteur de modèle de données personnalisées afin que je puisse rendre la cellule différemment en fonction sur son contenu.
Voici le sélecteur de modèle
public class CustomRowDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
var presenter = container as ContentPresenter;
var gridCell = presenter.Parent as DataGridCell;
if (element != null && item != null && gridCell != null)
{
var row = item as DataRow;
if (row != null)
{
var cellObject = row[gridCell.Column.DisplayIndex];
//set template based on cell type
if (cellObject is DateTime)
{
return element.FindResource("dateCell") as DataTemplate;
}
return element.FindResource("stringCell") as DataTemplate;
}
}
return null;
}
}
Voici mon stringCell DataTemplate
<DataTemplate x:Key="stringCell">
<StackPanel>
<TextBlock Style="{StaticResource cellStyle}"
Grid.Row="0" Grid.Column="0"
Text="{Binding Converter={StaticResource cellConverter}}" />
</StackPanel>
</DataTemplate>
Le problème est que le sélecteur de modèle est appelé pour chaque cellule (comme prévu), mais je ne peux pas dire quelle cellule il est, donc je ne sais pas comment définir le texte sur le TextBlock. J'aimerais faire quelque chose comme ceci
<DataTemplate x:Key="stringCell">
<StackPanel>
<TextBlock Style="{StaticResource cellStyle}"
Grid.Row="0" Grid.Column="0"
Text="{Binding Path=Row[CellIndex], Converter={StaticResource cellConverter}}" />
</StackPanel>
</DataTemplate>
Mais il n'y a rien disponible pour moi pour obtenir CellIndex. Comment puis-je faire quelque chose de similaire à cela où je peux définir le chemin = Row [CellIndex]