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
その引数を呼び出すだけで、結果を返します。actualは、実際には のBinding
が何であれバインドされます。喜んでそれを無視し、代わりにパラメーターを操作します。DataContext
ComboBox
EnumConverter
アップデート
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);
}
タイピングが少なく、理解しやすいコードで同じ結果が得られます。