(十七)ComboBox控件扩展功能(绑定枚举元素)

1. 创建枚举

  • 在core enums
    image

补充知识点

Enum与string、int的转换

public enum Mode
{
    Study,
    Examination
}

1、enum转String
Enum.GetName(typeof(Mode), Mode.Study);
或者采用ToString方法:
Mode.Study.ToString();

2、string转enum
mode = (Mode)Enum.Parse(typeof(Mode), "Study", false);
ignoreCase值设置了false,是指是否忽略大小写

3、enum转int
enum转int采用int强转的方法:
(int)Mode.Study;

4、int转enum
(Mode)Enum.ToObject(typeof(Mode), 1);
同样,也可以强转:(Mode)1;

高级点用法,反射元数据

using System;
using System.ComponentModel;
namespace TestEnum
{
    //基础枚举
    public enum Name
    {
        [Description("鲍勃")]
        [DataTest("中文3级")]
        boob,
        [Description("马宇")]
        [DataTest("中文2级")]
        JackMa,
        [Description("陈龙")]
        [DataTest("中文1级")]
        JackChan,
        [Description("丽莎")]
        [DataTest("中文2级")]
        Lisa,
        [Description("保罗")]
        [DataTest("中文2级")]
        Poro
    }
    public class DataTest : Attribute
    {
        public string Data { get; set; }
        public DataTest(string data)
        {
            Data = data;
        }
        public DataTest(){}
    }

    static class EnumExtensions
    {
        public static string GetDescription(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
            return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
        }
        public static string GetData(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DataTest));
            return customAttribute == null ? val.ToString() : ((DataTest)customAttribute).Data;
        }
    }
}

我的GetDescription

 public static string GetEnumDescription(this object obj)
 {
     Assert.NotNull(obj);
     var type = obj.GetType();
     if (!type.IsEnum)
     {
         throw new Exception($"{type.FullName}必须为枚举类型");
     }

     FieldInfo fieldInfo=obj.GetType().GetField(obj.ToString());
     if (fieldInfo != null)
     {
         DescriptionAttribute attribute=Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute)) as DescriptionAttribute;
         if(attribute != null)
         {
             return attribute.Description;
         }
         else
         {
             return fieldInfo.Name;
         }
     }
     else
     {
         return string.Empty;
     }
 }

Attribute.GetCustomAttribute

image

DescriptionAttribute

指定属性或事件的说明。
image
image

2. 绑定源的元素实体

image

把枚举类转换成一个BindableSourceItem的集合

public static IEnumerable<BindableSourceItem<T>> GetBindableSourceItems<T>(this object obj,Func<T, bool> filter = null)where T : struct
{
    var type=typeof(T);//T代表ZoomMode这个model
    if (!type.IsEnum)
    {
        throw new Exception($"{type.FullName}必须为枚举类型");
    }
    //ZoomMode变成一个BindableSourceItem的集合
    var items =type.GetEnumValues().Cast<T>().Select(x =>new BindableSourceItem<T>()
    {
        //x代表具体某一个项
        Description=x.GetEnumDescription(),
        Value=x,
    });

    if(filter != null)
    {
        items = items.Where(p => filter(p.Value));
    }

    return items;
}

3.前台页面怎么使用

  • mainview
    image
  • image

4. binding方法

image

具体实现

image

posted @ 2023-12-26 10:52  huihui不会写代码  阅读(216)  评论(0)    收藏  举报