我有一个DataGrid,ItemsSource绑定到DataTable,我在后面的代码中填充。 DataTable具有动态数量的列,但前两个列始终是相同的纯文本列。我想要的是除前两列之外的所有列都使用我定义的DataTemplate
<DataGrid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" DataContext="{Binding myDataTable}" ItemsSource="{Binding}" />
这是模板
<DataTemplate x:Key="myCellTemplate">
<StackPanel>
<CheckBox IsChecked="{Binding IsAssigned}" />
<TextBlock Text="{Binding Quantity}" />
</StackPanel>
</DataTemplate>
DataTable在我的ViewModel中创建,列数在运行时定义:
DataTable table = new DataTable();
table.Columns.Add(new DataColumn("Name"));
table.Columns.Add(new DataColumn("ID"));
int colCount = 2;
foreach (Item i in this.Items)
{
if (item.Condition)
{
table.Columns.Add(new DataColumn(item.Name.ToString()));
colCount++;
}
}
如何为myCellTemplate
列中的单元格分配Item
?
答案 0 :(得分:2)
我过去以两种方式做过这件事。这是我对语法的最佳猜测,尽管它根本没有经过测试。
使用AutoGeneratingColumn事件根据列特定值设置属性(如模板),例如Header或DisplayIndex。
private void MyDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
string headerName = e.Column.Header.ToString();
int columnIndex = e.Column.DisplayIndex;
// change some property of e.Column based on headerName or columnIndex
}
在DataGridCell样式中使用DataTrigger。您可以在Column.DisplayIndex
或Column.Header
设置触发器。
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Template" Value="{StaticResource myCellTemplate}" />
<Style.Triggers>
<DataTrigger Value="0" Binding="{Binding Path=Column.DisplayIndex, RelativeSource={RelativeSource Self}}">
<Setter Property="Template" Value="{StaticResource defaultTemplate}" />
</DataTrigger>
<DataTrigger Value="1" Binding="{Binding Path=Column.DisplayIndex, RelativeSource={RelativeSource Self}}">
<Setter Property="Template" Value="{StaticResource defaultTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
您需要为前两列定义的默认模板才能使用此XAML,除非您要创建转换器以确定DisplayIndex > 1
或ColumnName != ID or Name