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>