Grille de propriétés sur les objets composites
-
04-07-2019 - |
Question
Quand je lie cet objet
public class MyObject
{
public AgeWrapper Age
{
get;
set;
}
}
public class AgeWrapper
{
public int Age
{
get;
set;
}
}
dans une grille de propriétés, ce qui est indiqué dans la section des valeurs de la grille de propriétés correspond au nom de classe d’AgeWrapper, mais correspond à la valeur de AgeWrapper.Age.
Y a-t-il un moyen de faire en sorte que dans la grille de propriétés, je puisse afficher la valeur de l'objet composite (dans ce cas, il s'agit de AgeWrapper.Age), au lieu du nom de classe de cet objet composite?
La solution
Vous devez créer un convertisseur de type, puis l'appliquer à l'aide d'un attribut à la classe AgeWrapper. Ensuite, la grille de propriétés utilisera ce convertisseur de type pour obtenir l'affichage de la chaîne. Créez un convertisseur de type comme celui-ci ...
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);
}
}
Notez qu'il hérite de ExpandableObjectConverter. En effet, la classe AgeWrapper a une propriété enfant appelée AgeWrapper.Age qui doit être exposée en plaçant un bouton + à côté de l'entrée AgeWrapper dans la grille. Si votre classe n'a aucune propriété enfant que vous souhaitez exposer, héritez plutôt de TypeConverter. Appliquez maintenant ce convertisseur à votre classe ...
[TypeConverter(typeof(AgeWrapperConverter))]
public class AgeWrapper