【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));
相关推荐
IccBoY14 小时前
Java采用easyexcel组件进行excel表格单元格的自动合并
java·开发语言·excel
tt55555555555514 小时前
C++ 经典数组算法题解析与实现教程
开发语言·c++·算法
会跑的葫芦怪14 小时前
Go语言操作Redis
开发语言·redis·golang
泽虞14 小时前
《Qt应用开发》笔记
linux·开发语言·c++·笔记·qt
专职14 小时前
pytest详细教程
开发语言·python·pytest
专职14 小时前
pytest+requests+allure生成接口自动化测试报告
开发语言·python·pytest
风起云涌~14 小时前
【Java】浅谈ServiceLoader
java·开发语言
那我掉的头发算什么14 小时前
【数据结构】优先级队列(堆)
java·开发语言·数据结构·链表·idea
.ZGR.16 小时前
C语言:数组的增删查改2.0
c语言·开发语言
漫漫不慢.16 小时前
算法练习-二分查找
java·开发语言·算法