Хорошо, у меня есть кое-что для работы, которое может удовлетворить ваш случай.
Чтобы получить класс для расширения в PropertyGrid, вы должны добавить к нему TypeConverterAttribute
, ссылаясь на тип ExpandableObjectConverter
(или что-то еще, производное от него).
[TypeConverter(typeof(ExpandableObjectConverter))]
public class Test
{
[Browsable(true)]
public string A { get; set; }
[Browsable(true)]
public string B { get; set; }
}
Единственная проблема состоит в том, что теперь он отображает имя типа (возвращаемое значение его ToString()
метода в качестве значения вашего класса). ). Вы можете либо жить с этим (что, вероятно, вам не нужно), изменить возвращаемое значение ToString()
на что-то более подходящее или использовать для этого случая пользовательский TypeConverter
.
Я покажу вам быстрая реализация того, как это можно сделать:
internal class TestConverter : ExpandableObjectConverter
{
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
return "";
return base.ConvertTo(context, culture, value, destinationType);
}
}
И тогда вы бы написали это вместо того, что я написал выше:
[TypeConverter(typeof(TestConverter))]
public class Test
{
[Browsable(true)]
public string A { get; set; }
[Browsable(true)]
public string B { get; set; }
}
Это просто опустошает информацию и предотвращает пользователь вводит какое-то другое значение. Вы, вероятно, хотите показать что-то более наглядное, что полностью зависит от вас.
Также возможно получить информацию и разобрать ее на полезные значения. Хорошим примером может служить местоположение, представляющее собой объект типа Point
, визуализируемый с помощью [10,5]
, когда X
равно 10
и Y
равно 5
. Когда вы вводите новые значения, они анализируются и устанавливаются в целые числа, на которые ссылается исходная строка.
Поскольку я не мог найти много о topi c, я посмотрел некоторые ссылки в ReferenceSource , потому что это нужно было сделать раньше. В моем случае я заглянул в ButtonBase и FlatButtonAppearance WindowsForms, чтобы посмотреть, как Microsoft сделала это, в тот день.
Надеюсь, что смогу помочь.