Если вы хотите, чтобы выбранное значение ComboBox было преобразовано обратно в перечисление, то вам нужно будет реализовать ConvertBack
.
Я бы лично пошел с атрибутом descriptionшаблон, который вы упомянули, потому что
- очевидные вопросы уже заданы, и
- Вы не ограничены просто вставкой пробелов в верхнем регистре - вы можете использовать любое описание, которое хотите.
Но если вы хотите использовать этот шаблон, вам просто нужно правильно написать конвертер.Я бы предложил что-то вроде этого:
// Convert method
var formattedNames = new List<string>();
foreach (var value in Enum.GetValues(typeof(Things)))
{
// Format is a method to convert the enum value to the display string
var formattedName = Format(value);
formattedNames.Add(formattedName);
}
// return a list of strings that you can bind to
return formattedNames;
// ConvertBack method
// Unformat is a method to revert the display string back to the enum value
var value = Unformat(formattedValue);
return Enum.Parse(typeof(Things), value);
Вы также можете создать простой класс для хранения как отображаемого значения, так и перечисления, а затем соответствующим образом установить свойство DisplayPath
в поле со списком
class DisplayEnum
{
public string DisplayValue { get;set; }
public MyEnum ActualValue { get;set; }
}
<ComboBox DisplayMemberPath=DisplayValue ...
Редактировать
Я понимаю, что это не сработает, потому что ConvertBack
пытается преобразовать строку в перечисление, но фактический набор привязок равен List<string>
.Я оставлю это здесь, потому что это начало в правильном направлении.
Я думаю, вам понадобится два конвертера
- для преобразования enum введите в набор значений перечисления и
- для преобразования значения перечисления в строку.Этот второй конвертер должен реализовывать метод
ConvertBack
.
Как я уже указывал, если вы не реализуете ConvertBack
, вы не сможете привязать SelectedValue обратно к вашему свойству enum в ViewModel.