C# 对未知列使用特定的DataTemplate

C# 对未知列使用特定的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,其中ItemsSource绑定到我在代码隐藏中填充的DataTable。DataTable具有动态列数,但前2列始终是相同的纯文本列。我想要的是,除了前两列之外,其他所有列都使用我定义的DataTemplate

<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>
    
  • 在DataGridCell样式中使用DataTrigger。您可以在
    列.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