2011-01-12 14 views
10

Wiem, że mogę to zrobić, pisząc niestandardowe deskryptory typów itp., Jednak biorąc pod uwagę, jak proste jest to wymaganie; brakuje mi łatwego sposobu na zrobienie tego.Jak wyświetlić właściwość bool jako Tak | Nie w siatce właściwości?

Możliwość ustawiania ciągu znaków "true" i "false" w BooleanConverter może być wszystkim, czego potrzebuję, ale standardowy BooleanConverter wydaje się nie pozwalać ci ustawiać niestandardowych ciągów znaków.

Odpowiedz

9

Będziesz musiał go dostosować. Tak:

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" }; 
} 

wykorzystanie próbki:

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

uzyskać żadnej pomocy od System.Globalization do tej pracy w innych językach.

+0

Dzięki, blisko, ale gdy dwukrotnie kliknę wartość, otrzymam błąd Dlg "Wartość właściwości nie jest poprawna"/"Obiekt typu" System.String "nie może zostać przekonwertowany na typ" System.Boolean "." –

+0

Ugh, pita. Umieść właściwość PropertyGrid w formularzu, aby debugować to w czasie wykonywania. –

+1

Możesz potrzebować System :: Convert :: ToBoolean (wartość) zamiast rzutowania na wartość bool. – ThePragmatist

3

Można uniknąć wykonania niestandardowe konwertera przy użyciu ENUM:

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; } 
} 

jak jest, to rozwiązanie nie jest lokalizowanymi, i trzeba by wdrożyć wyliczenia dla każdej permutacji „ON/OFF "pary wartości, których chciałeś użyć. Ale to prosta odpowiedź na jednorazowe.

Powiązane problemy