Además de la respuesta de Adam Markowitz, aquí hay una forma de propósito general de (relativamente) simplemente establecer los ItemSource
valores de un cuadro combinado enums
, mientras se muestra el atributo 'Descripción' al usuario. (Uno pensaría que todos querrían hacer esto para que sea un .NET one liner, pero simplemente no lo es, y esta es la forma más elegante que he encontrado).
Primero, cree esta clase simple para convertir cualquier valor de Enum en un elemento 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;
}
}
En segundo lugar, en el OnLoad
controlador de eventos, es necesario establecer el origen de su cuadro combinado a ser una lista de ComboEnumItems
base en todos los Enum
de su Enum
tipo. Esto se puede lograr con Linq. Luego solo configura 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";
}
Ahora el usuario seleccionará de una lista de sus usuarios amigables Descriptions
, pero lo que seleccionarán será el enum
valor que puede usar en el código. Para acceder a la selección del usuario en el código, comboBoxUserReadable.SelectedItem
será el ComboEnumItem
y comboBoxUserReadable.SelectedValue
será el EMyEnum
.