Марка, прямо применяет EditorAttribute к адвокатуре типа во всем мире. Если у вас есть деликатное расположение, вы можете скорее аннотировать свойства конкретных экземпляров. Увы, это невозможно с TypeDescriptor.AddAttributes
Моим решением было написать обертку ViewModel<T>
, которая копирует свойства из T, аннотируя некоторые дополнительные атрибуты. Предположим, что мы имеем переменную datum
типа отчета, мы должны использовать его, как этот
var pretty = ViewModel<Report>.DressUp(datum);
pretty.PropertyAttributeReplacements[typeof(Smiley)] = new List<Attribute>() { new EditorAttribute(typeof(SmileyEditor),typeof(UITypeEditor))};
propertyGrid1.SelectedObject = pretty;
Где ViewModel<T>
определяется:
public class ViewModel<T> : CustomTypeDescriptor
{
private T _instance;
private ICustomTypeDescriptor _originalDescriptor;
public ViewModel(T instance, ICustomTypeDescriptor originalDescriptor) : base(originalDescriptor)
{
_instance = instance;
_originalDescriptor = originalDescriptor;
PropertyAttributeReplacements = new Dictionary<Type,IList<Attribute>>();
}
public static ViewModel<T> DressUp(T instance)
{
return new ViewModel<T>(instance, TypeDescriptor.GetProvider(instance).GetTypeDescriptor(instance));
}
/// <summary>
/// Most useful for changing EditorAttribute and TypeConvertorAttribute
/// </summary>
public IDictionary<Type,IList<Attribute>> PropertyAttributeReplacements {get; set; }
public override PropertyDescriptorCollection GetProperties (Attribute[] attributes)
{
var properties = base.GetProperties(attributes).Cast<PropertyDescriptor>();
var bettered = properties.Select(pd =>
{
if (PropertyAttributeReplacements.ContainsKey(pd.PropertyType))
{
return TypeDescriptor.CreateProperty(typeof(T), pd, PropertyAttributeReplacements[pd.PropertyType].ToArray());
}
else
{
return pd;
}
});
return new PropertyDescriptorCollection(bettered.ToArray());
}
public override PropertyDescriptorCollection GetProperties()
{
return GetProperties(null);
}
}
Как определено выше, это заменяет свойства определенного типа, но вы может заменить свойства по имени, если вам нужно большее разрешение.
Марк, молодец. Я бы посоветовал создать дескриптор пользовательского типа и поставщика, чтобы опубликовать его, но ваш метод является хорошим ярлыком для регистрации провайдера за сценой и ввода редактора! Узнал что-то. –
Ничего себе, это очень просто на практике. Благодаря! –
Это прекрасно! Я работаю над библиотекой чертежей и хочу предоставить поддержку редактора PropertyGrid для объектов, не принимая зависимость от Windows Forms от библиотеки объектов, чтобы украсить свойства. Это решение позволяет мне создавать редакторы вне основной библиотеки и добавлять их во время выполнения. –