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

时间:2015-06-23 10:56:10

标签: c# wpf data-binding datagrid enums

我有一个DataGrid绑定在带有一些枚举和字符串的对象的简单ObservableCollection上。 (5个枚举和2个要激励的字符串)。现在,其中两个枚举(它们是相同的类型)需要使用它们的描述符显示在comboBox中。但我无法弄清楚如何告诉各列使用枚举的描述。

这是我的dataGrid

<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的外观。

enter image description here

需要描述的两列是Size1和Size2。 列是自动生成的,我只是想弄清楚如何使用枚举描述。

1 个答案:

答案 0 :(得分:0)

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

首先,请附加到DataGrid的{​​{3}}事件:

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

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

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

其次,您可以访问e.Column媒体资源并应用DataTemplate。 然后,DataTemplate会使用转换器ComboBoxColumn中显示正确的文字。这个转换器会尝试解析&#34;枚举成员属性作为显示名称,或只显示实际的枚举值。

编辑#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;