这真是让我抓狂。我正在通过代码创建一个DataGrid,然后将其绑定到数据表。这是动态的,每次创建网格时行和列都会不同。
基本上,我遍历我的数据表,并为每一列创建DataGrid列,就像这样:
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);
}
}
正如您所见,我正在使用自定义数据模板选择器,这样可以根据内容以不同方式呈现单元格。
以下是模板选择器:
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;
}
}
这是我的stringCell数据模板。
<DataTemplate x:Key="stringCell">
<StackPanel>
<TextBlock Style="{StaticResource cellStyle}"
Grid.Row="0" Grid.Column="0"
Text="{Binding Converter={StaticResource cellConverter}}" />
</StackPanel>
</DataTemplate>
问题是模板选择器会为每个单元格调用(正如预期的那样),但我无法确定它是哪个单元格,因此我不知道如何在TextBlock上设置文本。我希望能做像这样的事情。
<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>
但是我无法获取CellIndex,该怎么做才能实现类似的功能,即设置路径=行[CellIndex]?