Я не нашел решения для чистого и пригодного для повторного использования кода для привязки перечисления к выпадающему списку в WinUi 3.
У меня есть общий класс, который содержит все перечисления моих проектов, и у меня есть этот код:
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». Как я могу это сделать? Спасибо всем
Также это stackoverflow.com/questions/3985876/…
Спасибо за ваш ответ @Tatranskymedved, но я пытаюсь последний час следовать этому ответу, который вы мне предоставили, но безуспешно ... можете ли вы уточнить и сделать для меня пример кода, начиная с моего собственного?
это ответ, который делает именно то, что вы хотите 🔁 stackoverflow.com/a/12430331/7167572
@Tatranskymedved хорошее и очень элегантное решение, но я пытаюсь, и оно не работает ... все отображается пустым ... Я пытаюсь использовать Эндрю Keepcofing (менее элегантно, но очень хорошо), и оно работает!





Вы можете сделать это с помощью 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>
Спасибо! Отлично работает! Лучше всего было бы удалить шаблон данных и свойство ViewsMode для ItemSource, как это сделано в ссылке на другой комментарий, но и в этом случае это работает очень хорошо. спасибо
Отвечает ли это на ваш вопрос? Привязка к отображению атрибута name перечисления в xaml