Я бы предложил DataTemplate и ValueConverter. Это позволит вам настроить способ его отображения, но вы все равно сможете прочитать свойство SelectedItem комбобокса и получить фактическое значение перечисления.
ValueConverters требует много стандартного кода, но здесь нет ничего слишком сложного. Сначала вы создаете класс ValueConverter:
public class ModeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
return ((Mode) value).GetDescription();
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
throw new NotSupportedException();
}
}
Поскольку вы преобразуете только перечисляемые значения в строки (для отображения), вам не нужен ConvertBack - это только для сценариев двустороннего связывания.
Затем вы помещаете экземпляр ValueConverter в ваши ресурсы, что-то вроде этого:
<Window ... xmlns:WpfApplication1="clr-namespace:WpfApplication1">
<Window.Resources>
<WpfApplication1:ModeConverter x:Key="modeConverter"/>
</Window.Resources>
....
</Window>
Тогда вы готовы предоставить ComboBox DisplayTemplate, который форматирует свои элементы с помощью ModeConverter:
<ComboBox Name="comboBox" ...>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource modeConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Чтобы проверить это, я также добавил Label, который показал бы мне фактическое значение SelectedItem, и он действительно показал, что SelectedItem - это перечисление вместо отображаемого текста, что я и хотел бы:
<Label Content="{Binding ElementName=comboBox, Path=SelectedItem}"/>