Lebih jauh dari jawaban Adam Markowitz, berikut ini adalah cara tujuan umum (relatif) hanya mengatur ItemSourcenilai - nilai kotak kombo menjadi enums, sambil menunjukkan atribut 'Deskripsi' kepada pengguna. (Anda akan berpikir semua orang ingin melakukan ini sehingga itu akan menjadi .NET one liner, tetapi tidak, dan ini adalah cara paling elegan yang saya temukan).
Pertama, buat kelas sederhana ini untuk mengonversi nilai Enum apa pun menjadi 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;
}
}
Kedua di OnLoadevent handler Anda, Anda perlu mengatur sumber dari kotak kombo Anda menjadi daftar ComboEnumItemsberdasarkan setiap tipe EnumAnda Enum. Ini bisa dicapai dengan Linq. Kemudian cukup atur 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";
}
Sekarang pengguna akan memilih dari daftar ramah pengguna Anda Descriptions, tetapi apa yang mereka pilih akan menjadi enumnilai yang dapat Anda gunakan dalam kode. Untuk mengakses pilihan pengguna dalam kode, comboBoxUserReadable.SelectedItemakan menjadi ComboEnumItemdan comboBoxUserReadable.SelectedValueakan menjadi EMyEnum.