WinUI 3中如何将ComboBox绑定到枚举并显示Display属性值?
WinUI 3 绑定枚举到ComboBox并显示Display特性名称的两种实现方案
方案一:使用IValueConverter实现转换
这种方案无需修改现有ViewModel集合,通过转换器直接将枚举值转为Display特性的名称。
- 创建枚举转换类
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; } }
- 在XAML中声明转换器资源
<Page.Resources> <local:EnumToDisplayConverter x:Key="EnumToDisplayConverter"/> </Page.Resources>
- 修改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>
方案二:通用枚举包装类(推荐高复用场景)
通过封装通用类将枚举值与显示名称绑定,适合项目中多个枚举需要类似处理的场景。
- 创建通用枚举项类
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(); } }
- 更新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(); } } }
- 修改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
相关产品推荐
相关产品推荐

