XAML WinUI 3 -将组合框绑定到枚举并显示Display属性

xt0899hw  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(157)

我没有想出一个解决方案,一个干净的和可恢复的代码绑定一个枚举到一个组合框在WinUi3。
我有一个通用类,它包含我的项目的所有枚举,其中我有以下代码:

public class Enums
    {
        public enum ViewMode
        {
            [Display(Name = "Come nel dispositivo")]
            AsDevice,
            [Display(Name = "Chiaro")]
            Light,
            [Display(Name = "Scuro")]
            Dark
        }
    }

在ViewModel文件中,我有这样的代码:

private IList<Enums.ViewMode> _viewsMode = Enum.GetValues(typeof(Enums.ViewMode)).Cast<Enums.ViewMode>().ToList();

public IList<Enums.ViewMode> ViewsMode => _viewsMode;
public Enums.ViewMode ViewMode
{
    get { return _model.ViewMode; }
    set
    {
        if (_model.ViewMode != value)
        {
           _model.ViewMode = value;
           RaisePropertyChanged();
           UpdateCommand.RaiseCanExecuteChanged();
         }
     }
}

最后,在xaml文件中,我有这样的代码:

<ComboBox Width="160" ItemsSource="{x:Bind ViewModel.ViewsMode}" SelectedItem="{x:Bind ViewModel.ViewMode,Mode=TwoWay}"/>

到目前为止一切顺利,它工作完美。但它显示“AsDevice”或“Light”或“Dark”,而我想显示DisplayName属性为“Come nel dispositivo”或“Chiaro”或“Scuro”,我该如何做到这一点?谢谢大家

qjp7pelc

qjp7pelc1#

您可以使用ValueConverter来执行此操作:

public class EnumToDisplayNameConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value is Enum enumValue &&
            enumValue.GetType()
                .GetMember(enumValue.ToString())
                .FirstOrDefault()
                    ?.GetCustomAttribute<DisplayAttribute>()
                    ?.GetName() is string displayName
                        ? displayName
                        : $"Unknow value: {value}";
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

然后像这样使用它:

<Page
    x:Class="EnumDisplayNameExample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="using:EnumDisplayNameExample"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    mc:Ignorable="d">
    <Page.Resources>
        <local:ViewModel x:Name="ViewModel" />
        <local:EnumToDisplayNameConverter x:Key="EnumToDisplayNameConverter" />
    </Page.Resources>

    <StackPanel>
        <ComboBox
            Width="160"
            ItemsSource="{x:Bind ViewModel.ViewsMode}"
            SelectedItem="{x:Bind ViewModel.ViewMode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Converter={StaticResource EnumToDisplayNameConverter}}" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
        <TextBlock Text="{x:Bind ViewModel.ViewMode, Mode=OneWay, Converter={StaticResource EnumToDisplayNameConverter}}" />
    </StackPanel>

</Page>

相关问题