您不需要自定义单元格模板,DataGrid 有一个内置的DataGridComboBoxColumn。在正常模式下,它将值显示为文本,在编辑模式下,它显示ComboBox。
您必须公开enum 定义为集合的常量。您可以为其创建一个简单的MarkupExtension,它返回任何给定enum 类型的值。
public class EnumValuesExtension : MarkupExtension
{
public Type Type { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.GetValues(typeof(MyEnum));
}
}
这是您的DataGrid 的示例。如您所见,您可以简单地使用标记扩展将组合框列的ItemsSource 绑定到您的enum 类型,此处为MyEnum。
<DataGrid ItemsSource="{Binding newItems}">
<DataGrid.Columns>
<DataGridComboBoxColumn ItemsSource="{local:EnumValues Type={x:Type local:MyEnum}}"
SelectedItemBinding="{Binding DataType}"/>
</DataGrid.Columns>
</DataGrid>
在您的模型中,将enum 类型用于DataType 属性。我认为将其公开为string 没有任何用处。上面的示例假设您使用的是 enum 类型,而不是 string。
但是,如果您真的依赖 string,您可以创建一个简单的 value converter。
public class StringToEnumConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Enum.Parse((Type)parameter, (string)value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString();
}
}
这会将组合框列上的绑定更改为:
<DataGridComboBoxColumn ItemsSource="{local:EnumValues Type={x:Type local:MyEnum}}"
SelectedItemBinding="{Binding DataType, Converter={StaticResource StringToEnumConverter}, ConverterParameter={x:Type local:MyEnum}}"/>