You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI 3中如何将ComboBox绑定到枚举并显示Display属性值?

WinUI 3 绑定枚举到ComboBox并显示Display特性名称的两种实现方案

方案一:使用IValueConverter实现转换

这种方案无需修改现有ViewModel集合,通过转换器直接将枚举值转为Display特性的名称。

  1. 创建枚举转换类
using System.ComponentModel.DataAnnotations;
using System.Reflection;
using Microsoft.UI.Xaml.Data;

public class EnumToDisplayConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null || !value.GetType().IsEnum)
            return value?.ToString() ?? string.Empty;

        var fieldInfo = value.GetType().GetField(value.ToString());
        var displayAttribute = fieldInfo?.GetCustomAttribute<DisplayAttribute>();
        
        return displayAttribute?.Name ?? value.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        // 若不需要反向转换(ComboBox已绑定枚举类型的SelectedItem),返回默认值即可
        return DependencyProperty.UnsetValue;
    }
}
  1. 在XAML中声明转换器资源
<Page.Resources>
    <local:EnumToDisplayConverter x:Key="EnumToDisplayConverter"/>
</Page.Resources>
  1. 修改ComboBox的ItemTemplate使用转换器
<ComboBox Width="160" 
          ItemsSource="{x:Bind ViewModel.ViewsMode}" 
          SelectedItem="{x:Bind ViewModel.ViewMode, Mode=TwoWay}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource EnumToDisplayConverter}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

方案二:通用枚举包装类(推荐高复用场景)

通过封装通用类将枚举值与显示名称绑定,适合项目中多个枚举需要类似处理的场景。

  1. 创建通用枚举项类
using System.ComponentModel.DataAnnotations;
using System.Reflection;

public class EnumItem<T> where T : Enum
{
    public T Value { get; set; }
    public string DisplayName { get; set; }

    public static List<EnumItem<T>> GetAllItems()
    {
        return Enum.GetValues(typeof(T))
                   .Cast<T>()
                   .Select(e => new EnumItem<T>
                   {
                       Value = e,
                       DisplayName = GetDisplayName(e)
                   })
                   .ToList();
    }

    private static string GetDisplayName(T enumValue)
    {
        var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
        var displayAttribute = fieldInfo?.GetCustomAttribute<DisplayAttribute>();
        return displayAttribute?.Name ?? enumValue.ToString();
    }
}
  1. 更新ViewModel中的集合类型
private List<EnumItem<Enums.ViewMode>> _viewsMode = EnumItem<Enums.ViewMode>.GetAllItems();

public List<EnumItem<Enums.ViewMode>> ViewsMode => _viewsMode;

public Enums.ViewMode ViewMode
{
    get { return _model.ViewMode; }
    set
    {
        if (_model.ViewMode != value)
        {
            _model.ViewMode = value;
            RaisePropertyChanged();
            UpdateCommand.RaiseCanExecuteChanged();
        }
    }
}
  1. 修改ComboBox绑定逻辑
<ComboBox Width="160" 
          ItemsSource="{x:Bind ViewModel.ViewsMode}" 
          DisplayMemberPath="DisplayName"
          SelectedValuePath="Value"
          SelectedValue="{x:Bind ViewModel.ViewMode, Mode=TwoWay}"/>

注意:如果项目未引用System.ComponentModel.DataAnnotations命名空间,需安装NuGet包System.ComponentModel.Annotations。

内容的提问来源于stack exchange,提问作者pinguinone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:20:01