Ngoài câu trả lời của Adam Markowitz, đây là cách mục đích chung (tương đối) chỉ đơn giản là đặt các ItemSource
giá trị của hộp tổ hợp thành enums
, đồng thời hiển thị thuộc tính 'Mô tả' cho người dùng. (Bạn sẽ nghĩ mọi người đều muốn làm điều này để nó sẽ là một .NET lớp lót , nhưng thực tế không phải vậy, và đây là cách thanh lịch nhất mà tôi đã tìm thấy).
Đầu tiên, tạo lớp đơn giản này để chuyển đổi bất kỳ giá trị Enum nào thành một mục 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;
}
}
Thứ hai, trong OnLoad
trình xử lý sự kiện của bạn , bạn cần đặt nguồn của hộp tổ hợp thành một danh sách ComboEnumItems
dựa trên mỗi loại Enum
trong Enum
loại của bạn . Điều này có thể đạt được với Linq. Sau đó, chỉ cần đặt 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";
}
Bây giờ người dùng sẽ chọn từ danh sách người dùng thân thiện của bạn Descriptions
, nhưng những gì họ chọn sẽ là enum
giá trị mà bạn có thể sử dụng trong mã. Để truy cập lựa chọn của người dùng trong mã, comboBoxUserReadable.SelectedItem
sẽ là ComboEnumItem
và comboBoxUserReadable.SelectedValue
sẽ là EMyEnum
.