Además de la respuesta de Adam Markowitz, aquí hay una forma de propósito general de (relativamente) simplemente establecer los ItemSourcevalores 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 OnLoadcontrolador de eventos, es necesario establecer el origen de su cuadro combinado a ser una lista de ComboEnumItemsbase en todos los Enumde su Enumtipo. 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 enumvalor que puede usar en el código. Para acceder a la selección del usuario en el código, comboBoxUserReadable.SelectedItemserá el ComboEnumItemy comboBoxUserReadable.SelectedValueserá el EMyEnum.