ItemsSource속성에 Enum타입을 바인딩하여 아래 이미지처럼 나열할 수 있다.

public enum ImageExtension
{
    Jpg,
    Png,
    Gif,
    Bmp,
    Ico
}

image

ObjectDataProvider를 이용하는 방법

System.Enum.GetValues함수는 매개변수로 지정한 Enum타입의 목록을 반환한다. 해당 메서드를 ObjectDataProvider에 지정하여 ItemSource에 바인딩할 수 있다.

  • Enum.GetValues
// 해당 Enum타입의 목록을 가져옴.
public static Array GetValues(Type enumType);
  • ObjectDataProvider 정의
<Window.Resources>
    <ObjectDataProvider x:Key="ItemExtensionType" MethodName="GetValues"
                        ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:ItemExtension"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
  • ItemsSource 바인딩
<Grid>
    <ComboBox ItemsSource="{Binding Source={StaticResource ItemExtensionType}}" />
    <ListBox ItemsSource="{Binding Source={StaticResource ItemExtensionType}}" /> 
</Grid>

MarkupExtension을 이용한 방법

매개변수로 받은 Enum타입에 대한 목록을 반환하는 MarkupExtension을 정의하여 바인딩한다.

  • MarkupExtension 정의
public class EnumBindingSourceExtension : MarkupExtension
{
    private Type _enumType;
    public Type EnumType
    {
        get { return this._enumType; }
        set
        {
            if (value != this._enumType)
            {
                if (null != value)
                {
                    Type enumType = Nullable.GetUnderlyingType(value) ?? value;
                    if (!enumType.IsEnum)
                        throw new ArgumentException("Type must be for an Enum.");
                }
                this._enumType = value;
            }
        }
    }
    
    public EnumBindingSourceExtension() { }
    
    public EnumBindingSourceExtension(Type enumType)
    {
        this.EnumType = enumType;
    }
    
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        Array enumValues = Enum.GetValues(EnumType);
        
        return enumValues;
    }
}
  • ItemsSource 바인딩
<Grid>
    <ComboBox ItemsSource="{Binding Source={local:EnumBindingSource {x:Type local:ItemExtension}}}"/>
    <ListBox ItemsSource="{Binding Source={local:EnumBindingSource {x:Type local:ItemExtension}}}"/>
</Grid>

참고

http://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/

카테고리:

업데이트:

댓글남기기