ObjectDataProvider
не поддерживает такую функциональность, но вы можете «подделать» ее с помощью умного злоупотребления использованием Binding
и IValueConverter
.
Сначала IValueConverter
:
class EnumConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Enum.GetValues((Type)parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Вот как вы его используете:
<Window
x:Class="EnumTest.MainWindow"
[...snip...]
xmlns:local="clr-namespace:EnumTest"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Window.Resources>
<local:EnumConverter x:Key="EnumConverter" />
</Window.Resources>
<StackPanel>
<ComboBox ItemsSource="{Binding Converter={StaticResource EnumConverter}, ConverterParameter={x:Type local:MyEnum1}}" />
<ComboBox ItemsSource="{Binding Converter={StaticResource EnumConverter}, ConverterParameter={x:Type local:MyEnum2}}" />
</StackPanel>
</Window>
Некоторые контрольные перечисления:
enum MyEnum1
{
Red,
Green,
Blue,
}
enum MyEnum2
{
Cat,
Dog,
Fish,
Bird,
}
Это дает следующий вывод:
Это использует тот факт, что вы можете передать дополнительный параметр в IValueConverter
, который я использую для передачи Type
перечисления в преобразователь. Преобразователь просто вызывает Enum.GetNames
для этого аргумента и возвращает результат. Фактический Binding
будет фактически привязан к тому, чем будет DataContext
из ComboBox
. EnumConverter
просто счастливо игнорирует его и вместо этого работает с параметром.
UPDATE
Работает еще лучше, привязываясь непосредственно к типу, полностью пропуская ConverterParameter
, вот так:
<ComboBox ItemsSource="{Binding Source={x:Type local:MyEnum1}, Converter={StaticResource EnumConverter}}" />
С настройками преобразователя:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Enum.GetValues((Type)value);
}
Тот же результат с меньшим набором текста и более легким для понимания кодом.