definiert ich eine benutzerdefinierte ExpandableObjectConverter
für Sammlungen:Hinzufügen von Typdeskriptoren zu allen Listen <T> für eine generische Implementierung der Eigenschaftsrastererweiterung?
internal class ExpandableCollectionConverter : ExpandableObjectConverter
{
public override PropertyDescriptorCollection GetProperties(
ITypeDescriptorContext context, object value, Attribute[] attributes)
{
//implementation that returns a list of property descriptors,
//one for each item in "value"
}
}
und haben auch eine Proxy-Klasse ExpandableObjectManager
, die im Wesentlichen erledigt diese genannt:
TypeDescriptor.AddAttributes(type,
new TypeConverterAttribute(typeof(ExpandableCollectionConverter)));
Mit dieser Methode:
public static class ExpandableObjectManager
{
public static void AddTypeDescriptor(Type tItem)
{
//eventually calls TypeDescriptor.AddAttributes
}
}
Ist es möglich, den Typdeskriptor so hinzuzufügen, dass alle allgemeinen List<T>
in der Datei erweiterbar sind Grid-Gitter? Um zum Beispiel eine einfache Employee
Klasse gegeben:
class Employee
{
public string Name { get; set; }
public string Title { get; set; }
public DateTime DateOfBirth { get; set; }
}
ich das tun kann (und es funktioniert, aber nur für List<Employee>
):
ExpandableObjectManager.AddTypeDescriptor(typeof(List<Employee>));
würde Ich mag alle T
decken, nicht nur Employee
, ohne eine Zeile für jede mögliche Klasse schreiben zu müssen. Ich habe versucht, diese - nicht funktioniert:
ExpandableObjectManager.AddTypeDescriptor(typeof(List<>));
TL; DR: Standardansicht einer Liste, wenn sie als SelectedObject
im Eigenschaftenraster festgelegt:
Erwartete Ergebnisse :
Ohne einen Typdeskriptor für List<Employee>
hinzufügen und stattdessen einige generische Handler für alle List<T>
.
Vielen Dank für Ihre Antwort. Leider funktioniert keine der beiden Optionen für mich, da # 1 bei einigen Objekten bereits eine gute Implementierung eines erweiterbaren Objektkonverters hat, den ich bei der Einstellung meines eigenen zerbrechen würde. Zum Beispiel enums.# 2 Ich möchte keine benutzerdefinierte Klasse zur Darstellung der Liste erstellen. Dies fügt dem Programm unnötige Komplexität hinzu. Auch vorhandene Assemblies können es nicht verwenden. –
Neolisk
Völlig verständlich. Wenn ich eine bessere Option finde, werde ich es teilen. – Grax
Ich habe eine dritte Option hinzugefügt. Ich habe es zuerst aufgelistet, weil es am lebensfähigsten scheint. – Grax