wpf ComboBox控件下拉绑定枚举值
问题
近来在开发一个wpf的桌面端应用程序。有如下定义的枚举值
public enum SuLiaoLeiXingEnum
{
[Description("ST类型")]
SU_ST,
[Description("EP类型")]
SU_EP,
[Description("NN类型")]
SU_NN,
[Description("CC类型")]
SU_CC
}
需要将该该枚举的类型绑定到UI的ComboBox控件上,同时显示自定义的内容,不是程序中定义的ST,EP,NN,CC,而是显示 ST类型,EP类型,NN类型,CC类型。枚举值的定义包含参数汉子是不合适的。
解决办法
给枚举的每个字段自定义一个Attribute。然后通过IValueConverter接口,将枚举值转换为Attribute定义的Description。同时也能通过Description来获取对应的枚举值。
IValueConverter的定义
public class SuLiaoLeiXingEnumConverter : IValueConverter
{
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return EnumExtend<SuLiaoLeiXingEnum>.GetDescriptionByEnum((SuLiaoLeiXingEnum)value);
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return EnumExtend<SuLiaoLeiXingEnum>.GetEnumValueByDescription(value.ToString());
}
定义EnumExtend<T>泛型方法,该类主要作用将枚举转化为Description对应的自定义描述,同时能够根据Description属性描述转化为枚举值。
ExumExtend<T>泛型类的定义如下:
public static class EnumExtend<T> where T : Enum
{
/// <summary>
/// 根据枚举的description回去对应的枚举值
/// </summary>
/// <param name="desc"></param>
/// <returns></returns>
public static T GetEnumValueByDescription(string desc)
{
foreach (T item in Enum.GetValues(typeof(T)))
{
if (GetDescriptionByEnum(item) == desc)
{
return item;
}
}
return default;
}
/// <summary>
/// 将枚举转换为description
/// </summary>
/// <param name="enumVal"></param>
/// <returns></returns>
public static string GetDescriptionByEnum(Enum enumVal)
{
string val = enumVal.ToString();
FieldInfo fieldInfo = enumVal.GetType().GetField(val);
if (fieldInfo == null)
{
return val;
}
else
{
var attr = (DescriptionAttribute[])Attribute.GetCustomAttributes(fieldInfo, typeof(DescriptionAttribute));
if (attr != null && attr.Length > 0)
{
return attr[0].Description;
}
else
{
return val;
}
}
}
}
界面上的使用
将枚举值作为一个静态资源来使用
<UserControl.Resources>
<converter:JiaoDaiLeiXingEnumConverter x:Key="SuLiaoLeiXingConvert"/>
<ObjectDataProvider x:Key="suliaoleixing" MethodName="GetValues" ObjectType="{x:Type e:SuLiaoLeiXingEnum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="e:SuLiaoLeiXingEnum"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</UserControl.Resources>
在控件中使用
<ComboBox Margin="0" ItemsSource="{Binding Source={StaticResource suliaoleixing}}" SelectedItem="{Binding Path=【选中的值】}" Grid.Row="0">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=., Converter={StaticResource SuLiaoLeiXingConvert}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</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#
很赞哦! (0)