封装WPF绑定枚举用法

前言:

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

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

封装代码

1.EnumerationMember.cs

C# 复制代码
    public class EnumerationMember
    {
        public string Description { get; set; }
        public object Value { get; set; }
    }

2.EnumerationExtension.cs

C# 复制代码
    [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<Type, EnumerationMember[]> Enums { get; } = new ConcurrentDictionary<Type, EnumerationMember[]>();


        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

C# 复制代码
    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

C# 复制代码
<Window
    x:Class="WPFApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WPFApp"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <StackPanel>
            <ComboBox
                DisplayMemberPath="Description"
                ItemsSource="{local:Enumeration EnumType={x:Type local:FruitsEnum}}"
                SelectedValue="{Binding Fruits, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                SelectedValuePath="Value" />
        </StackPanel>
    </Grid>
</Window>

3.MainWindowViewModel.cs

C# 复制代码
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);
        }
    }
}
相关推荐
lalala_Zou5 小时前
场景题:电商平台订单未支付过期如何实现自动关闭订单?
wpf
czhc11400756635 小时前
wpf 16
wpf
cn_mengbei1 天前
鸿蒙PC原生应用开发实战:ArkTS与DevEco Studio从零构建跨端桌面应用全栈指南
华为·wpf·harmonyos
lingxiao168881 天前
WebApi详解+Unity注入--上篇:基于Framework的WebApi
c#·wpf·web
是一个Bug1 天前
Java后端开发面试题清单(50道) - 分布式基础
java·分布式·wpf
无心水1 天前
【分布式利器:腾讯TSF】4、TSF配置中心深度解析:微服务动态配置的终极解决方案
分布式·微服务·架构·wpf·分布式利器·腾讯tsf·分布式利器:腾讯tsf
lingxiao168882 天前
WebApi详解+Unity注入--下篇:Unity注入
unity·c#·wpf
无心水2 天前
【分布式利器:腾讯TSF】6、TSF可观测性体系建设实战:Java全链路Metrics+Tracing+Logging落地
java·分布式·架构·wpf·分布式利器·腾讯tsf·分布式利器:腾讯tsf
故事不长丨3 天前
C#字典(Dictionary)全面解析:从基础用法到实战优化
开发语言·c#·wpf·哈希算法·字典·dictionary·键值对
冰茶_3 天前
WPF路由事件:隧道与冒泡机制解析
学习·c#·.net·wpf·.netcore·mvvm