将特定DataTemplate用于未知列

时间:2016-05-10 14:27:55

标签: c# wpf datatable datagrid

我有一个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

1 个答案:

答案 0 :(得分:2)

我过去以两种方式做过这件事。这是我对语法的最佳猜测,尽管它根本没有经过测试。

  1. 使用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
    }
    
  2. 在DataGridCell样式中使用DataTrigger。您可以在Column.DisplayIndexColumn.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 > 1ColumnName != ID or Name