在 DataGridComboBox 中对自动生成的 DataGrid 列使用枚举描述

Use enum descriptions in DataGridComboBox for auto generated DataGrid Columns

我有一个 DataGrid 绑定在一个简单的 ObservableCollection 对象上,带有一些枚举和字符串。 (确切地说是 5 个枚举和 2 个字符串)。现在,这些枚举中的两个(相同类型)需要使用它们的描述符才能显示在组合框中。但我不知道如何告诉各个列使用枚举的描述。

这是我的数据网格

<DataGrid x:Name="dataGrid" ItemsSource="{Binding StartConditions}" CanUserReorderColumns="False" CanUserSortColumns="False" 
          AutoGenerateColumns="True" CanUserResizeRows="False" CanUserAddRows="False" CellStyle="{StaticResource DataGridCellStyle}"
                SelectedItem="{Binding SelectedStartCondition}">
</DataGrid>

这是带有我绑定的描述的枚举。

  enum Size
  {
    [Description("8-Bit")]
    EightBit,
    [Description("16-Bit")]
    SixteenBit,
    Bit0,
    Bit1,
    Bit2,
    Bit3,
    Bit4,
    Bit5,
    Bit6,
    Bit7,
    Lower4,
    Upper4
  }

这就是我的 DataGrid 的样子。

需要描述的两列是 Size1 和 Size2。 这些列是自动生成的,我只是不知道如何使用枚举描述。

你想实现的是可能的,但有点棘手,在性能方面不是很明智。您将修改列生成过程以显示正确的文本。

首先,附加到 DataGridAutoGeneratingColumn 事件:

<DataGrid x:Name="dataGrid"
          ...
          AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />
</DataGrid>

在此处理程序中,您可以修改列:

void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    // e.Column contains the generated column
}

其次,您可以访问e.Column属性并应用DataTemplateDataTemplate 然后会使用 转换器 ComboBoxColumn 中显示正确的文本。此转换器将尝试 "parse" 枚举成员属性作为显示名称,或仅显示实际枚举值。

编辑#1:

如 OP 所述,DataGridColumn 不提供 CellTemplate 属性。 因此,您必须在事件处理程序中覆盖创建的列:

var oldColumn = e.Column;
var newColumn = new DataGridTemplateColumn();
// Copy required properties from 'oldColumn' to 'newColumn'

// Create cell template (or load from XAML resources)
var cellTemplate = new DataTemplate();
// modify template...
newColumn.CellTemplate = cellTemplate;
e.Column = newColumn;