Além da resposta de Adam Markowitz, eis uma maneira geral de (relativamente) simplesmente definir o ItemSource
valores de uma caixa de combinação enums
, mostrando o atributo 'Descrição' para o usuário. (Você acha que todo mundo gostaria de fazer isso para que fosse um .NET um liner do , mas não é, e é a maneira mais elegante que eu encontrei).
Primeiro, crie esta classe simples para converter qualquer valor Enum em um item ComboBox:
public class ComboEnumItem {
public string Text { get; set; }
public object Value { get; set; }
public ComboEnumItem(Enum originalEnum)
{
this.Value = originalEnum;
this.Text = this.ToString();
}
public string ToString()
{
FieldInfo field = Value.GetType().GetField(Value.ToString());
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
return attribute == null ? Value.ToString() : attribute.Description;
}
}
Em segundo lugar no seu OnLoad
manipulador de eventos, você precisa definir a fonte de sua caixa de combinação para ser uma lista de ComboEnumItems
base em toda Enum
a sua Enum
tipo. Isso pode ser alcançado com o Linq. Em seguida, basta definir o DisplayMemberPath
:
void OnLoad(object sender, RoutedEventArgs e)
{
comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
.Cast<EMyEnum>()
.Select(v => new ComboEnumItem(v))
.ToList();
comboBoxUserReadable.DisplayMemberPath = "Text";
comboBoxUserReadable.SelectedValuePath= "Value";
}
Agora, o usuário selecionará de uma lista amigável Descriptions
, mas o que selecionar será o enum
valor que você pode usar no código. Para acessar a seleção do usuário no código, comboBoxUserReadable.SelectedItem
será o ComboEnumItem
e comboBoxUserReadable.SelectedValue
será o EMyEnum
.