Marc-Lösung gilt unverblümt die Editor an die Bar global geben. Wenn Sie eine delikate Disposition haben, können Sie Eigenschaften bestimmter Instanzen annotieren. Leider ist das mit TypeDescriptor.AddAttributes
nicht möglich Meine Lösung war, einen Wrapper ViewModel<T>
zu schreiben, der Eigenschaften von T kopiert, einige mit zusätzlichen Attributen annotierend. Angenommen, wir haben eine variable datum
vom Typ Report, würden wir es verwenden, wie diese
var pretty = ViewModel<Report>.DressUp(datum);
pretty.PropertyAttributeReplacements[typeof(Smiley)] = new List<Attribute>() { new EditorAttribute(typeof(SmileyEditor),typeof(UITypeEditor))};
propertyGrid1.SelectedObject = pretty;
Wo ViewModel<T>
definiert:
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);
}
}
Wie oben definiert, diese ersetzt Eigenschaften eines bestimmten Typs, aber Sie kann Eigenschaften nach Namen ersetzen, wenn Sie die größere Auflösung benötigen.
Marc, gut gemacht. Ich hätte empfohlen, einen benutzerdefinierten Typdeskriptor und den Provider zu veröffentlichen, aber Ihre Methode ist eine gute Abkürzung, um den Anbieter hinter der Szene zu registrieren und den Editor zu injizieren !! Etwas gelernt. –
Wow, das ist in der Praxis sehr einfach. Vielen Dank! –
Das ist perfekt! Ich arbeite an einer Zeichnungsbibliothek und wollte PropertyGrid-Editor-Unterstützung für Objekte bereitstellen, ohne eine Abhängigkeit von Windows Forms aus der Objektbibliothek zu nehmen, um die Eigenschaften zu dekorieren. Diese Lösung ermöglicht es mir, die Editoren außerhalb der Kernbibliothek zu erstellen und sie zur Laufzeit hinzuzufügen. –