因此,在对所有这些进行了更多的摆弄之后,我得出了一个非常好的解决方案。
最好和最简单的做法是在加载 DataGrid 后将数据模板应用于特定行。因此,我坚持使用 DataTables 的原始想法,并记住需要更改其模板的索引。我刚刚从这些索引中获取了 DataGridRows,并应用了具有自定义 ItemsPanelTemplate 的模板,该模板跨越了多个列。
编辑:应丹尼尔的要求,我包含了一些代码。
首先我们需要一个跨行模板:
<ControlTemplate TargetType='{x:Type DataGridRow}'
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<Border>
<DataGridCellsPresenter Foreground='Black'>
<DataGridCellsPresenter.ItemsPanel>
<ItemsPanelTemplate>
<local:DataGridSpannedCellPanel />
</ItemsPanelTemplate>
</DataGridCellsPresenter.ItemsPanel>
</DataGridCellsPresenter>
</Border>
</ControlTemplate>
注意:local:DataGridSpannedCellPanel 是一个自定义的 DataGridCellsPanel,它具有重写的 ArrangeOverride 方法,使第一个单元格跨越整个大小。
例如,您可以在代码隐藏中创建一个字符串并从中加载您的模板。接下来是创建网格并使用这个新模板初始化一些行:
var newGrid = MakeNewDataGrid();
newGrid.ItemsSource = myTable.AsDataView();
var template = XamlReader.Parse(HeaderRowTemplate) as ControlTemplate;
foreach (int index in myHeaderIndices)
{
var container = newGrid.ItemContainerGenerator.ContainerFromIndex(index);
var row = container as DataGridRow;
if (row != null)
{
row.Template = template;
}
}
另请注意,表中的行需要如下所示:
if (bindableQuote.IsGroup())
{
table.Rows.Add("Header");
}
else
{
table.Rows.Add(rowData.ToArray());
}
就是这样,剩下的就是弄清楚如何实现DataGridSpannedCellPanel。