2011-01-12 3 views
10

필자는 사용자 지정 형식 설명자 등을 작성하여이 작업을 수행 할 수 있음을 알고 있습니다. 그러나이 요구 사항이 얼마나 단순한 지 알 수 있습니다. 나는 그것을하는 쉬운 방법을 놓치고있다.bool 속성을 속성 표에 예/아니요로 표시하려면 어떻게해야합니까?

BooleanConverter에서 "true"및 "false"에 대한 문자열을 설정할 수 있다는 것이 내가 필요한 모든 것 일지 모르지만 표준 BooleanConverter는 사용자 정의 문자열을 설정할 수있는 것처럼 보이지 않습니다.

답변

9

사용자 정의해야합니다.

class YesNoConverter : BooleanConverter { 
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { 
     if (value is bool && destinationType == typeof(string)) { 
      return values[(bool)value ? 1 : 0]; 
     } 
     return base.ConvertTo(context, culture, value, destinationType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { 
     string txt = value as string; 
     if (values[0] == txt) return false; 
     if (values[1] == txt) return true; 
     return base.ConvertFrom(context, culture, value); 
    } 

    private string[] values = new string[] { "No", "Yes" }; 
} 

샘플 사용 :이처럼

class MyControl : Control { 
    [TypeConverter(typeof(YesNoConverter))] 
    public bool Prop { get; set; } 
} 

당신은 다른 언어로이 작품을 만들기 위해의 System.Globalization로부터 도움을받을 수 없습니다.

+0

감사합니다. 값을 더블 클릭하면 "속성 값이 유효하지 않습니다."/ " 'System.String'형식의 개체를 'System.Boolean'형식으로 변환 할 수 없습니다." –

+0

어, 피타. 런타임에 이것을 디버깅 할 수있는 폼에 PropertyGrid를 배치하십시오. –

+1

bool에 대한 캐스트 대신 System :: Convert :: ToBoolean (값)이 필요할 수 있습니다. – ThePragmatist

3

당신은 열거 사용하여 사용자 지정 컨버터를 구현 피할 수 :

public enum YesNo{No,Yes} 

... 

[Browsable(true)] 
public YesNo IsValueSet {get;set) 

[Browsable(false)] //also consider excluding it from designer serialization 
public bool ValueSetAsBool 
{ 
    get { return Convert.ToBoolean((byte)IsValueSet); } 
    set { IsValueSet = value ? YesNo.Yes : YesNo.No; } 
} 

은 그대로,이 솔루션은 지역화되지 않습니다, 당신은 설정/해제 "의 모든 순열에 대한 열거를 구현해야 할 것이다 "가치 쌍을 사용하고 싶습니다. 그러나 일회성에 대한 간단한 대답입니다.

관련 문제