Domanda

Quando associo questo oggetto

public class MyObject
{ 
  public AgeWrapper Age
{
get;
set;
}
}

public class AgeWrapper
{
public int Age
{
get;
set;
}
}

in una griglia di proprietà, ciò che viene mostrato nella sezione valore della griglia di proprietà è il nome della classe di AgeWrapper, ma il valore per AgeWrapper.Age.

Esiste un modo per farlo in modo che nella griglia delle proprietà posso mostrare il valore dell'oggetto composito (in questo caso, è AgeWrapper.Age), invece del nome della classe di quell'oggetto composito?

È stato utile?

Soluzione

Devi creare un convertitore di tipi e quindi applicarlo usando un attributo alla classe AgeWrapper. Quindi la griglia delle proprietà utilizzerà quel tipo di convertitore per visualizzare la stringa. Crea un convertitore di tipi come questo ...

public class AgeWrapperConverter : ExpandableObjectConverter
{
  public override bool CanConvertTo(ITypeDescriptorContext context, 
                                    Type destinationType)
  {
    // Can always convert to a string representation
    if (destinationType == typeof(string))
      return true;

    // Let base class do standard processing
    return base.CanConvertTo(context, destinationType);
  }

  public override object ConvertTo(ITypeDescriptorContext context, 
                                   System.Globalization.CultureInfo culture, 
                                   object value, 
                                   Type destinationType)
  {
    // Can always convert to a string representation
    if (destinationType == typeof(string))
    {
      AgeWrapper wrapper = (AgeWrapper)value;
      return "Age is " + wrapper.Age.ToString();
    }

    // Let base class attempt other conversions
    return base.ConvertTo(context, culture, value, destinationType);
  }  
}

Si noti che eredita da ExpandableObjectConverter. Questo perché la classe AgeWrapper ha una proprietà figlio chiamata AgeWrapper.Age che deve essere esposta avendo un pulsante + vicino alla voce AgeWrapper nella griglia. Se la tua classe non aveva proprietà secondarie che desideri esporre, eredita invece da TypeConverter. Ora applica questo convertitore alla tua classe ...

[TypeConverter(typeof(AgeWrapperConverter))]
public class AgeWrapper
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top