Сетка собственности на Композитные объекты
-
04-07-2019 - |
Вопрос
Когда я связываю этот объект
public class MyObject
{
public AgeWrapper Age
{
get;
set;
}
}
public class AgeWrapper
{
public int Age
{
get;
set;
}
}
для сетки свойств в разделе значений сетки свойств отображается имя класса AgeWrapper, но значение для AgeWrapper.Age.
Есть ли способ сделать так, чтобы в сетке свойств я мог показывать значение составного объекта (в данном случае это AgeWrapper.Age) вместо имени класса этого составного объекта?
Решение
Вам необходимо создать конвертер типов, а затем применить его с помощью атрибута к классу AgeWrapper. Затем сетка свойств будет использовать этот конвертер типов для отображения отображаемой строки. Создайте конвертер типов, как этот ...
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);
}
}
Обратите внимание, что он наследуется от ExpandableObjectConverter. Это связано с тем, что класс AgeWrapper имеет дочернее свойство AgeWrapper.Age, которое необходимо отображать, располагая кнопку + рядом с записью AgeWrapper в сетке. Если у вашего класса нет дочерних свойств, которые вы хотели бы предоставить, то вместо этого наследуйте от TypeConverter. Теперь примените этот конвертер к своему классу ...
[TypeConverter(typeof(AgeWrapperConverter))]
public class AgeWrapper