封装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);
        }
    }
}
相关推荐
FuckPatience1 天前
WPF 具有跨线程功能的UI元素
wpf
诗仙&李白1 天前
HEFrame.WpfUI :一个现代化的 开源 WPF UI库
ui·开源·wpf
He BianGu1 天前
【笔记】在WPF中Binding里的详细功能介绍
笔记·wpf
He BianGu2 天前
【笔记】在WPF中 BulletDecorator 的功能、使用方式并对比 HeaderedContentControl 与常见 Panel 布局的区别
笔记·wpf
123梦野2 天前
WPF——效果和可视化对象
wpf
He BianGu2 天前
【笔记】在WPF中Decorator是什么以及何时优先考虑 Decorator 派生类
笔记·wpf
时光追逐者3 天前
一款专门为 WPF 打造的开源 Office 风格用户界面控件库
ui·开源·c#·.net·wpf
He BianGu3 天前
【笔记】介绍 WPF XAML 中 Binding 的 StringFormat详细功能
笔记·wpf
Rotion_深4 天前
C# WPF使用线程池运行Action方法
c#·wpf·线程池
攻城狮CSU4 天前
WPF 深入系列.2.布局系统.尺寸属性
wpf