wpf 当DataGrid列模版是ComboBox时,显示信息

​ 实际工作中,有时DataGrid控件某一列显示数据是从Enum集合里面选择出来的,那这时候设置列模版为ComboBox就能满足需求。而关于显示的实际内容,直接是Enum的string()返回值可能不太适合,这时候采用System.ComponentModel.Description是一个很好用的方法。

代码中定义的显示类型是Enum,实际结果在Description中声明。

定义 Enum Week

    [System.ComponentModel.Description("星期")]
    public enum Week
    {
        [System.ComponentModel.Description("星期一")]
        Monday,

        [System.ComponentModel.Description("星期二")]
        Tuesday,

        [System.ComponentModel.Description("星期三")]
        Wednesday,

        [System.ComponentModel.Description("星期四")]
        Thursday,

        [System.ComponentModel.Description("星期五")]
        Firday,

        [System.ComponentModel.Description("星期六")]
        Saturday,

        [System.ComponentModel.Description("星期日")]
        Sunday,
    }

DataGrid模版:


    
    
    
            
        
        
            
                
            
        
    



    
        
            
                
            
        
        
        
        
    
    
    
        
            
                
                    
                
            
        
        
        
    

WeekEnumToDescriptionConvertor、WeekEnumToComboBoxIndexConvertor实现代码:

    class WeekEnumToComboBoxIndexConvertor : System.Windows.Data.IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return ((int)(Week)value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return ((Week)(int)value);
        }
    }

    class WeekEnumToDescriptionConvertor : System.Windows.Data.IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var strValue = value as string[];
            if (strValue != null)
            {
                var enValue = new Week[strValue.Length];
                for (int i = 0; i < strValue.Length; i++)
                {
                    if (Enum.TryParse(strValue[i], out enValue[i]))
                        strValue[i] = enValue[i].GetDescription();
                }
            }
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

EnumHelper代码:

    public static class EnumHelper
    {
        public static string GetDescription(this T value) where T : struct
        {
            string result = value.ToString();

            var fi = typeof(T).GetField(result);

            var attributes = (System.ComponentModel.DescriptionAttribute[])fi.GetCustomAttributes(
                typeof(System.ComponentModel.DescriptionAttribute), true);

            if (attributes != null && attributes.Length > 0)
            {
                return attributes[0].Description;
            }
            return result;
        }

        public static T GetValueByDescription(this string description) where T : struct
        {
            Type type = typeof(T);
            foreach (var field in type.GetFields())
            {
                if (field.Name == description)
                {
                    return (T)field.GetValue(null);
                }

                var attributes = (System.ComponentModel.DescriptionAttribute[])field.GetCustomAttributes(
                    typeof(System.ComponentModel.DescriptionAttribute), true);

                if (attributes != null && attributes.Length > 0)
                {
                    if (attributes[0].Description == description)
                    {
                        return (T)field.GetValue(null);
                    }
                }
            }
            throw new ArgumentException(string.Format($"{description} 未能找到对应的枚举"), "Description");
        }

        public static T GetValue(this string value) where T : struct
        {
            T result;
            if (Enum.TryParse(value, true, out result))
            {
                return result;
            }
            throw new ArgumentException(string.Format($"{value} 未能找到对应的枚举"), "Value");
        }

    }

最终效果图
wpf 当DataGrid列模版是ComboBox时,显示信息_第1张图片

完整代码

你可能感兴趣的:(wpf 当DataGrid列模版是ComboBox时,显示信息)