WPF绑定枚举并且显示特性文本

一、文件结构

 

二、文件内容

FlattenMethodEnum.cs
     public enum FlattenMethodEnum
    {
        [Description("单点")]
        SinglePoint = 0,
        [Description("平均")]
        Average = 1,
    }
}

EnumBindingSourceExtension.cs

using System.Windows.Markup;
using System.Diagnostics.CodeAnalysis;
namespace Test.Helper { class EnumBindingSourceExtension : MarkupExtension { private Type? _enumType; public Type? EnumType { get => _enumType; set { if (value != _enumType) { if (value != null) { Type enumType = Nullable.GetUnderlyingType(value) ?? value; if (!enumType.IsEnum) throw new ArgumentException("Type must be for an Enum."); } _enumType = value; } } } public EnumBindingSourceExtension() { } public EnumBindingSourceExtension(Type enumType) { EnumType = enumType; } public override object ProvideValue(IServiceProvider serviceProvider) { if (_enumType == null) throw new InvalidOperationException("The EnumType must be specified."); var actualEnumType = Nullable.GetUnderlyingType(_enumType) ?? _enumType; var enumValues = System.Enum.GetValues(actualEnumType); if (actualEnumType == _enumType) return enumValues; var tempArray = Array.CreateInstance(actualEnumType, enumValues.Length + 1); enumValues.CopyTo(tempArray, 1); return tempArray; } } }

EnumDescriptionConverter.cs

using System.Windows.Data;
using System.ComponentModel;
using System.Globalization;
using System.Windows;

namespace Test.Helper
{
     class EnumDescriptionConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return DependencyProperty.UnsetValue;

            return GetEnumDescription(value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return string.Empty;
        }

        private string GetEnumDescription(object enumObj)
        {
            var fi = enumObj.GetType().GetField(enumObj.ToString());

            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes != null && attributes.Length > 0)
                return attributes[0].Description;
            else
                return enumObj.ToString();
        }
    }
}

三、使用

1、在View中引入命名空间

xmlns:enum="clr-namespace:Test.Enum"
xmlns:helper="clr-namespace:Test.Helper"  

2、引入资源; Tip:注意UserControl还是Window等

<UserControl.Resources>
    <helper:EnumBindingSource x:Key="enumDataSource" EnumType="{x:Type enum:SampleTypeEnum}"/>
    <helper:EnumDescriptionConverter x:Key="enumDescriptionConverter"/>
</UserControl.Resources>

3、ViewModel (使用了CommunityToolkit.MVVM包)

[ObservableProperty]
private SampleTypeEnum sampleType;

4、xaml

<ComboBox Width="80" Height="20"
          ItemsSource="{Binding Source={StaticResource enumDataSource}}" 
          SelectedItem="{Binding SampleType}"> <!-- 绑定枚举 -- >
    <ComboBox.ItemTemplate> <!-- 显示特性 -->
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource enumDescriptionConverter}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
posted @ 2024-11-20 19:19  WilsonH  阅读(3)  评论(0编辑  收藏  举报