封装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);
        }
    }
}
相关推荐
Java Fans7 小时前
在WPF项目中集成Python:Python.NET深度实战指南
python·.net·wpf
布伦鸽15 小时前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
code bean2 天前
【WPF】WPF 项目实战:构建一个可增删、排序的光源类型管理界面(含源码)
wpf
沉到海底去吧Go2 天前
【图片识别改名】如何批量将图片按图片上文字重命名?自动批量识别图片文字并命名,基于图片文字内容改名,WPF和京东ocr识别的解决方案
ocr·wpf·图片识别改名·图片识别重命名·图片内容改名
lph19722 天前
自定义事件wpf
wpf
code bean2 天前
【WPF】从普通 ItemsControl 到支持筛选的 ItemsControl:深入掌握 CollectionViewSource 用法
wpf
碎碎念的安静2 天前
WPF可拖拽ListView
c#·wpf
界面开发小八哥3 天前
界面组件DevExpress WPF中文教程:Grid - 如何识别行和卡片?
.net·wpf·界面控件·devexpress·ui开发
TwilightLemon4 天前
WPF 使用CompositionTarget.Rendering实现平滑流畅滚动的ScrollViewer,支持滚轮、触控板、触摸屏和笔
wpf
Vae_Mars6 天前
WPF中自定义消息弹窗
wpf