【C#】在WPF中使用ComboBox绑定枚举类型

在WPF中使用ComboBox绑定枚举类型

一、实例

定义Enum:

cs 复制代码
internal enum StatusEnum
{
    [Description("待处理")]
    Pending,

    [Description("进行中")]
    InProgress,

    [Description("已完成")]
    Completed
}

定义扩展类,获取Description特性的内容:

cs 复制代码
internal static class EnumExtensions
{
    public static string GetDescription(this Enum value)
    {
        var field = value.GetType().GetField(value.ToString());
        var attribute = field?.GetCustomAttribute<DescriptionAttribute>();
        return attribute?.Description ?? value.ToString();
    }
}

值转换

cs 复制代码
internal class EnumToDescriptionConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Enum enumValue)
        {
            return enumValue.GetDescription();
        }
        return value.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Enum.Parse(targetType, value.ToString());
    }
}

对象数据源

xml 复制代码
    <UserControl.Resources>
        <ObjectDataProvider x:Key="StatusEnumProvider" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:StatusEnum" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </UserControl.Resources>

ComboBox 绑定数据源

xml 复制代码
 <ComboBox ItemsSource="{Binding Source={StaticResource StatusEnumProvider}}"
       SelectedItem="{Binding SelectedStatus}"
           Width="140" FontSize="14"
           FontFamily="Microsoft Yahei UI"
           Cursor="Hand" >
     <ComboBox.ItemTemplate>
         <DataTemplate>
             <TextBlock Text="{Binding Converter={StaticResource EnumToDescriptionConverter}}"/>
         </DataTemplate>
     </ComboBox.ItemTemplate>
 </ComboBox>

SelectedStatus要在ViewModel里定义

二、ObjectDataProvider

ObjectDataProvider 类在XAML中创建对象并将其用作数据源。

xml 复制代码
  <ObjectDataProvider x:Key="StatusEnumProvider"
  	MethodName="GetValues" 
  	ObjectType="{x:Type sys:Enum}">
      <ObjectDataProvider.MethodParameters>
          <x:Type TypeName="local:StatusEnum" />
      </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>
  • ObjectType - 数据要返回的对象类型
  • MethodName - 要在 System.Enum类型上运行的方法名称
  • MethodParameters - 要提供给 MethodName 方法的值的集合

等效于以下代码:

cs 复制代码
 var itemsSource= System.Enum.GetValues(typeof(StatusEnum));
相关推荐
2302_799525745 分钟前
【go语言】——方法集
开发语言·后端·golang
非 白17 分钟前
【Java 后端】Restful API 接口
java·开发语言·restful
rider18917 分钟前
Java多线程及线程变量学习:从熟悉到实战(下)
java·开发语言·学习
元亓亓亓18 分钟前
java后端开发day26--常用API(一)
java·开发语言
JP-Destiny20 分钟前
后端-Java虚拟机
java·开发语言·jvm
葡萄_成熟时_25 分钟前
JavaWeb后端基础(4)
java·开发语言·数据库·maven·web
InCerry28 分钟前
.NET周刊【2月第4期 2025-02-23】
c#·.net周报·.net周刊
Hello.Reader39 分钟前
深入解析 Rust 异步编程中的 Traits
开发语言·后端·rust
年少无知且疯狂1 小时前
C#释放内存空间的方法
c#
馨谙1 小时前
Exception in thread “main“ java.lang.ExceptionInInitializerError
java·开发语言