封装WPF绑定枚举用法

前言:

在ComboBox绑定ItemsSource时候,在绑定枚举时候,我们通常是采用定义一个列表,然后一个显示和值进行分开,这样显得比较麻烦,下面进行对这部分进行封装。

        private List> fruitList = new()
        {
            new Tuple ("苹果",FruitsEnum.Apple ),
            new Tuple ("香蕉",FruitsEnum.Banana ),
            new Tuple ("橙子",FruitsEnum.Orange ),
            new Tuple ("芒果",FruitsEnum.Mango ),
            new Tuple ("葡萄",FruitsEnum.Grapes ),
            new Tuple ("西瓜",FruitsEnum.Watermelon )
        };
        public List> FruitList
        {
            get => fruitList;
        }

封装代码

1.EnumerationMember.cs

    public class EnumerationMember
    {
        public string Description { get; set; }
        public object Value { get; set; }
    }

2.EnumerationExtension.cs

    [MarkupExtensionReturnType(typeof(EnumerationMember[]))]
    public class EnumerationExtension : MarkupExtension
    {
        private Type enumType;
        public Type EnumType
        {
            get=> enumType;
            set
            {
                if (enumType == value) return;
                var enumTypeTemp = Nullable.GetUnderlyingType(value) ?? value;
                if (enumTypeTemp.IsEnum == false) throw new ArgumentException("Type must be an Enum.");
                enumType = enumTypeTemp;
            }
        }
        private static ConcurrentDictionary Enums { get; } = new ConcurrentDictionary();


        public static EnumerationMember[] GetEnums(Type typez)
        {
            return Enums.GetOrAdd(typez, (type) =>
            {
                var enumValues = Enum.GetValues(type);

                return (
                  from object enumValue in enumValues
                  select new EnumerationMember
                  {
                      Value = enumValue,
                      Description = GetDescription(type, enumValue)
                  }).ToArray();
            });
        }

        private static string GetDescription(Type enum_type, object enumValue)
        {
            var descriptionAttribute = enum_type
              .GetField(enumValue.ToString())
              .GetCustomAttributes(typeof(DescriptionAttribute), false)
              .FirstOrDefault() as DescriptionAttribute;

            return descriptionAttribute != null
              ? descriptionAttribute.Description
              : enumValue.ToString();
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return GetEnums(EnumType);
        }
    }

使用:

1.FruitsEnum.cs

    public enum FruitsEnum
    {
        [Description("苹果")]
        Apple,
        [Description("香蕉")]
        Banana,
        [Description("橙子")]
        Orange,
        [Description("芒果")]
        Mango,
        [Description("葡萄")]
        Grapes,
        [Description("西瓜")]
        Watermelon,
        [Description("菠萝")]
        Pineapple,
        [Description("草莓")]
        Strawberry,
        [Description("蓝莓")]
        Blueberry,
        [Description("覆盆子")]
        Raspberry
    }

2.MainWindow.xaml


    
        
    
    
        
            
        
    

3.MainWindowViewModel.cs

using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WPFApp
{
    public class MainWindowViewModel : BindableBase
    {
        private FruitsEnum fruits;
        public FruitsEnum Fruits
        {
            get => fruits;
            set => SetProperty(ref fruits, value);
        }
    }
}

你可能感兴趣的:(WPF,wpf)