在 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。
这些列是自动生成的,我只是不知道如何使用枚举描述。
你想实现的是可能的,但有点棘手,在性能方面不是很明智。您将修改列生成过程以显示正确的文本。
首先,附加到 DataGrid
的 AutoGeneratingColumn
事件:
<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
中显示正确的文本。此转换器将尝试 "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;
我有一个 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。 这些列是自动生成的,我只是不知道如何使用枚举描述。
你想实现的是可能的,但有点棘手,在性能方面不是很明智。您将修改列生成过程以显示正确的文本。
首先,附加到 DataGrid
的 AutoGeneratingColumn
事件:
<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
中显示正确的文本。此转换器将尝试 "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;