一、文件结构
二、文件内容
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;elsereturn 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
[ObservableProperty] private SampleTypeEnum sampleTypeEnum;
4、xaml
<ComboBox Width="80" Height="20"ItemsSource="{Binding Source={StaticResource enumDataSource}}"SelectedItem="{Binding SampleTypeEnum}"><ComboBox.ItemTemplate><DataTemplate><TextBlock Text="{Binding Converter={StaticResource enumDescriptionConverter}}"/></DataTemplate></ComboBox.ItemTemplate> </ComboBox>
实现前台绑定