내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-07-31 06:38

제목

[WPF] TypeConverter의 EnumConverter를 이용한 Enum 어트리뷰트 값 바인딩 처리


아래 코드는

https://blog.naver.com/vactorman/221448480828

블로그 내용의 코드를 그대로 사용 했습니다.
(위 블로그 내용을 축소하였습니다.)

XAML에서 바인딩을 하게 되면 TypeConverter클래스 정보가 있을 경우  TypeConverter의 ConvertTo가 호출되어진다.
바로 저 
ConvertTo메서드를 오버라이드로 원하는 값으로 바인딩 되도록 재 구현해서 처리 할 수 있다.

EnumDescriptionConverter.cs

using System;
using System.Linq;
using System.Windows.Data;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
 
public class EnumDescriptionConverter<T> : EnumConverter where T : struct
{
    private static Dictionary<T, string> _descriptions = new Dictionary<T, string>();
 
    public EnumDescriptionConverter() : base(typeof(T))
    {
        this.Init();
    }
 
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType != typeof(string))
        {
            return base.ConvertTo(context, culture, value, destinationType);
        }
 
        if (value == null)
        {
            return string.Empty;
        }
 
        if (value is T == false)
        {
            return value.ToString();
        }
 
        var item = (T)value;
        if (_descriptions.ContainsKey(item) == false)
        {
            return value.ToString();
        }
 
         return _descriptions[item];
    }
 
    private void Init()
    {
        foreach (T item in Enum.GetValues(typeof(T)))
        {
            var fi = item.GetType().GetField(item.ToString());
            if (fi == null)
            {
                _descriptions.Add(item, item.ToString());
                continue;
            }
 
            var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attributes.Length < 1)
            {
                _descriptions.Add(item, item.ToString());
                continue;
            }
 
            if (string.IsNullOrWhiteSpace(attributes[0].Description))
            {
                _descriptions.Add(item, item.ToString());
                continue;
            }
            _descriptions.Add(item, attributes[0].Description);
        }
    }
}
cs

위와 같이 EnumConverter클래스를 상속받는 TypeConverter클래스를 하나 만들고
enum 열거형에서 다음과 같이 사용한다.

ViewModel

[TypeConverter(typeof(EnumDescriptionConverter<EUserType>))]
public enum EUserType
{
    [Description("관리자")]
    Admin,
    [Description("전문가")]
    Expert,
    [Description("일반회원")]
    Normal
}
 
 
public List<EUserType> UserTypeSelect
{
    get => Enum.GetValues(typeof(EUserType)).Cast<EUserType>().ToList();
}
cs

XAML

<ComboBox ItemsSource="{Binding UserTypeSelect}"
          SelectedItem="{Binding RegisterUserModel.UserType}"/>
cs


위 처럼 처리하게 되면 enum에 Description어트리뷰트 값이 바인딩 되는 것 을 확인할 수 있다.

출처1

https://blog.naver.com/vactorman/221448480828

출처2