C# 对未知列使用特定的DataTemplate
我有一个DataGrid,其中ItemsSource绑定到我在代码隐藏中填充的DataTable。DataTable具有动态列数,但前2列始终是相同的纯文本列。我想要的是,除了前两列之外,其他所有列都使用我定义的DataTemplateC# 对未知列使用特定的DataTemplate,c#,wpf,datatable,datagrid,C#,Wpf,Datatable,Datagrid,我有一个DataGrid,其中ItemsSource绑定到我在代码隐藏中填充的DataTable。DataTable具有动态列数,但前2列始终是相同的纯文本列。我想要的是,除了前两列之外,其他所有列都使用我定义的DataTemplate <DataGrid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" DataContext="{Binding myDataTable}" ItemsSource="{Binding}"
<DataGrid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" DataContext="{Binding myDataTable}" ItemsSource="{Binding}" />
如何将
myCellTemplate
分配给项
列中的单元格?我过去通过两种方式完成了这项工作。下面是我对语法的最佳猜测,尽管它还没有真正经过测试
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
}
<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>
列.DisplayIndex
或列.Header
上设置触发器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
}
<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或名称
我认为您可以使用DataGrid来影响每一列使用的模板。@Rachel感谢这种方法似乎很有前途,但有一个问题是我不确定myCellTemplate中的数据上下文是什么。当我更改模板时,单元格为空,因此我猜测我的绑定路径为Off。您的列包含一个
字符串
值,而您的单元格模板正试图绑定到字符串的已分配
和数量
属性,当然这些属性并不存在。我的建议是完全去掉DataTable
,并创建一个自定义类来正确表示您的项。在本例中,听起来您可能需要两个类:具有Id、名称和ClassB集合的ClassA,以及具有Value、IsAssigned和Quantity属性的ClassB。将数据解析到自定义类对象中,并将DataGrid绑定到对象的ObservableCollection