Lebih jauh dari jawaban Adam Markowitz, berikut ini adalah cara tujuan umum (relatif) hanya mengatur ItemSource
nilai - 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 OnLoad
event handler Anda, Anda perlu mengatur sumber dari kotak kombo Anda menjadi daftar ComboEnumItems
berdasarkan setiap tipe Enum
Anda 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 enum
nilai yang dapat Anda gunakan dalam kode. Untuk mengakses pilihan pengguna dalam kode, comboBoxUserReadable.SelectedItem
akan menjadi ComboEnumItem
dan comboBoxUserReadable.SelectedValue
akan menjadi EMyEnum
.