Suite à la réponse d'Adam Markowitz, voici une manière générale de définir (relativement) simplement les ItemSourcevaleurs d'une zone de liste déroulante enums, tout en montrant l'attribut «Description» à l'utilisateur. (On pourrait penser que tout le monde voudrait le faire pour que ce soit un .NET liner one , mais ce n'est tout simplement pas le cas, et c'est la manière la plus élégante que j'ai trouvée).
Tout d'abord, créez cette classe simple pour convertir n'importe quelle valeur Enum en un élément 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;
}
}
Deuxièmement, dans votre OnLoadgestionnaire d'événements, vous devez définir la source de votre zone de liste déroulante pour être une liste ComboEnumItemsbasée sur chaque élément Enumde votre Enumtype. Cela peut être réalisé avec Linq. Ensuite, définissez simplement 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";
}
Maintenant, l'utilisateur sélectionnera dans une liste de vos utilisateurs Descriptions, mais ce qu'il sélectionnera sera la enumvaleur que vous pouvez utiliser dans le code. Pour accéder à la sélection de l'utilisateur en code, comboBoxUserReadable.SelectedItemsera le ComboEnumItemet comboBoxUserReadable.SelectedValuesera le EMyEnum.