Grade de propriedade em objetos compostos
-
04-07-2019 - |
Pergunta
Quando eu ligar este objeto
public class MyObject
{
public AgeWrapper Age
{
get;
set;
}
}
public class AgeWrapper
{
public int Age
{
get;
set;
}
}
a uma grade de propriedade, o que é mostrado na seção valor da grade de propriedade é o nome da classe de AgeWrapper, mas o valor para AgeWrapper.Age.
Existe uma maneira de fazer com que na grade de propriedade que eu possa mostrar o valor do objeto composto (neste caso, é AgeWrapper.Age), em vez do nome da classe do objeto composto?
Solução
Você precisa criar um conversor de tipo e, em seguida, aplicar isso usando um atributo para a classe AgeWrapper. Em seguida, a grade de propriedade usará esse conversor tipo para obter a string para mostrar. Criar um conversor de tipo assim ...
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);
}
}
Observe que ele herda de ExpandableObjectConverter. Isso ocorre porque a classe AgeWrapper tem uma propriedade filho chamado AgeWrapper.Age que precisa ser exposta por ter um botão + ao lado da entrada AgeWrapper na grade. Se sua classe não tem nenhum propriedades filho que você queria expor então em vez herdar de TypeConverter. Agora aplicar este conversor para a sua classe ...
[TypeConverter(typeof(AgeWrapperConverter))]
public class AgeWrapper