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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App