wpf ComboBox控件下拉绑定枚举值

问题

近来在开发一个wpf的桌面端应用程序。有如下定义的枚举值

  1. public enum SuLiaoLeiXingEnum
  2. {
  3. [Description("ST类型")]
  4. SU_ST,
  5. [Description("EP类型")]
  6. SU_EP,
  7. [Description("NN类型")]
  8. SU_NN,
  9. [Description("CC类型")]
  10. SU_CC
  11. }

需要将该该枚举的类型绑定到UI的ComboBox控件上,同时显示自定义的内容,不是程序中定义的ST,EP,NN,CC,而是显示 ST类型,EP类型,NN类型,CC类型。枚举值的定义包含参数汉子是不合适的。

解决办法

给枚举的每个字段自定义一个Attribute。然后通过IValueConverter接口,将枚举值转换为Attribute定义的Description。同时也能通过Description来获取对应的枚举值。

IValueConverter的定义
  1. public class SuLiaoLeiXingEnumConverter : IValueConverter
  2. {
  3. /// <summary>
  4. ///
  5. /// </summary>
  6. /// <param name="value"></param>
  7. /// <param name="targetType"></param>
  8. /// <param name="parameter"></param>
  9. /// <param name="culture"></param>
  10. /// <returns></returns>
  11. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  12. {
  13. return EnumExtend<SuLiaoLeiXingEnum>.GetDescriptionByEnum((SuLiaoLeiXingEnum)value);
  14. }
  15. /// <summary>
  16. ///
  17. /// </summary>
  18. /// <param name="value"></param>
  19. /// <param name="targetType"></param>
  20. /// <param name="parameter"></param>
  21. /// <param name="culture"></param>
  22. /// <returns></returns>
  23. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  24. {
  25. return EnumExtend<SuLiaoLeiXingEnum>.GetEnumValueByDescription(value.ToString());
  26. }

定义EnumExtend<T>泛型方法,该类主要作用将枚举转化为Description对应的自定义描述,同时能够根据Description属性描述转化为枚举值。
ExumExtend<T>泛型类的定义如下:

  1. public static class EnumExtend<T> where T : Enum
  2. {
  3. /// <summary>
  4. /// 根据枚举的description回去对应的枚举值
  5. /// </summary>
  6. /// <param name="desc"></param>
  7. /// <returns></returns>
  8. public static T GetEnumValueByDescription(string desc)
  9. {
  10. foreach (T item in Enum.GetValues(typeof(T)))
  11. {
  12. if (GetDescriptionByEnum(item) == desc)
  13. {
  14. return item;
  15. }
  16. }
  17. return default;
  18. }
  19. /// <summary>
  20. /// 将枚举转换为description
  21. /// </summary>
  22. /// <param name="enumVal"></param>
  23. /// <returns></returns>
  24. public static string GetDescriptionByEnum(Enum enumVal)
  25. {
  26. string val = enumVal.ToString();
  27. FieldInfo fieldInfo = enumVal.GetType().GetField(val);
  28. if (fieldInfo == null)
  29. {
  30. return val;
  31. }
  32. else
  33. {
  34. var attr = (DescriptionAttribute[])Attribute.GetCustomAttributes(fieldInfo, typeof(DescriptionAttribute));
  35. if (attr != null && attr.Length > 0)
  36. {
  37. return attr[0].Description;
  38. }
  39. else
  40. {
  41. return val;
  42. }
  43. }
  44. }
  45. }
界面上的使用

将枚举值作为一个静态资源来使用

  1. <UserControl.Resources>
  2. <converter:JiaoDaiLeiXingEnumConverter x:Key="SuLiaoLeiXingConvert"/>
  3. <ObjectDataProvider x:Key="suliaoleixing" MethodName="GetValues" ObjectType="{x:Type e:SuLiaoLeiXingEnum}">
  4. <ObjectDataProvider.MethodParameters>
  5. <x:Type TypeName="e:SuLiaoLeiXingEnum"/>
  6. </ObjectDataProvider.MethodParameters>
  7. </ObjectDataProvider>
  8. </UserControl.Resources>

在控件中使用

  1. <ComboBox Margin="0" ItemsSource="{Binding Source={StaticResource suliaoleixing}}" SelectedItem="{Binding Path=【选中的值】}" Grid.Row="0">
  2. <ComboBox.ItemTemplate>
  3. <DataTemplate>
  4. <TextBlock Text="{Binding Path=., Converter={StaticResource SuLiaoLeiXingConvert}}"/>
  5. </DataTemplate>
  6. </ComboBox.ItemTemplate>
  7. </ComboBox>
结束

通过以上方法,可以将枚举值作为数据源绑定到ComboBox中。

本人承接C# wpf winform程序开发。熟悉行业,称重,砂石骨料称重,上位机开发,计算软件,宠物医院管理系统。

联系方式

Tel:17320170935(微信同号-添加请备注微见-KTV)
QQ:472198980 (添加请备注 微见-KTV)

2024-03-07 21:30:11  user 阅读(247) 评论(0) 标签:wpf,ComboBox,枚举,Description,Attribute,IValueConverter 分类:C#