在WPF中使用ComboBox绑定枚举类型
一、实例
定义Enum:
cs
internal enum StatusEnum
{
[Description("待处理")]
Pending,
[Description("进行中")]
InProgress,
[Description("已完成")]
Completed
}
定义扩展类,获取Description特性的内容:
cs
internal static class EnumExtensions
{
public static string GetDescription(this Enum value)
{
var field = value.GetType().GetField(value.ToString());
var attribute = field?.GetCustomAttribute<DescriptionAttribute>();
return attribute?.Description ?? value.ToString();
}
}
值转换
cs
internal class EnumToDescriptionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Enum enumValue)
{
return enumValue.GetDescription();
}
return value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Enum.Parse(targetType, value.ToString());
}
}
对象数据源
xml
<UserControl.Resources>
<ObjectDataProvider x:Key="StatusEnumProvider" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:StatusEnum" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</UserControl.Resources>
ComboBox 绑定数据源
xml
<ComboBox ItemsSource="{Binding Source={StaticResource StatusEnumProvider}}"
SelectedItem="{Binding SelectedStatus}"
Width="140" FontSize="14"
FontFamily="Microsoft Yahei UI"
Cursor="Hand" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource EnumToDescriptionConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
SelectedStatus要在ViewModel里定义
二、ObjectDataProvider
ObjectDataProvider 类在XAML中创建对象并将其用作数据源。
xml
<ObjectDataProvider x:Key="StatusEnumProvider"
MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:StatusEnum" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
- ObjectType - 数据要返回的对象类型
- MethodName - 要在 System.Enum类型上运行的方法名称
- MethodParameters - 要提供给 MethodName 方法的值的集合
等效于以下代码:
cs
var itemsSource= System.Enum.GetValues(typeof(StatusEnum));