2011-01-12 16 views
10

Sé que puedo hacer esto escribiendo descriptores de tipo personalizados, etc., sin embargo, dado lo simple que es este requisito; Me estoy perdiendo una manera fácil de hacerlo.¿Cómo se muestra una propiedad bool como Sí | No en la cuadrícula de propiedades?

Ser capaz de establecer la cadena para "verdadero" y "falso" en BooleanConverter puede ser todo lo que necesito, pero el BooleanConverter estándar no parece permitirle establecer cadenas personalizadas.

Respuesta

9

Tendrás que personalizarlo. De esta manera:

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

Ejemplo de uso:

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

No se obtiene ninguna ayuda de System.Globalization para hacer este trabajo en otros idiomas.

+0

Gracias, cierre, pero cuando hago doble clic en el valor obtengo un Error Dlg "El valor de la propiedad no es válido"/"Objeto del tipo 'System.String' no se puede convertir a tipo 'System.Boolean'." –

+0

Ugh, pita. Coloque un PropertyGrid en un formulario para depurar esto en tiempo de ejecución. –

+1

Es posible que necesite System :: Convert :: ToBoolean (value) en lugar del molde para bool. – ThePragmatist

3

Se podría evitar la aplicación de un convertidor personalizado utilizando una enumeración:

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

Como es, esta solución no es localizable, y usted tendría que poner en práctica una enumeración de todas las permutaciones de "On/Off "pares de valores que querías usar. Pero, es la respuesta simple para una sola vez.

Cuestiones relacionadas