DynamicObject an ein DataGrid mit automatischer Spaltengenerierung binden?

8

Ich experimentiere immer noch mit DynamicObjects. Jetzt brauche ich ein paar Informationen: Ich versuche ein Objekt zu binden, das von DynamicObject zu einem WPF DataGrid (nicht Silverlight) erbt.

Wie bekomme ich das DataGrid, um seine Spalten automatisch aus den verfügbaren öffentlichen Eigenschaften des Objekts zu erstellen, die normalerweise zur Laufzeit generiert werden? Ist das tatsächlich möglich?

    
Hendrik Wiese 18.03.2010, 22:19
quelle

2 Antworten

10

Es gibt keine einheitliche Möglichkeit, dynamische Eigenschaften abzufragen. Im Allgemeinen wird erwartet, dass Sie diese im Voraus kennen. Mit DynamicObject können Implementierer GetMemberNames überschreiben, und das gibt Ihnen im Allgemeinen die Eigenschaften, aber es ist wirklich für das Debuggen gedacht, da es keine Anforderung gibt, dass es alle Eigenschaften bereitstellt. Andernfalls, wenn es Ihr eigenes DynamicObject ist, müssen Sie nur Ihre eigene Methode schreiben, um die Eigenschaften basierend auf Ihrer dynamischen Implementierung zu erhalten. Mit ExpandoObject können Sie beispielsweise alle Eigenschaften über die Schnittstelle IDictionary abfragen.

Sobald Sie also eine Möglichkeit haben, Ihre Eigenschaften zu erhalten, müssen Sie das DataGrid informieren. Unglücklicherweise besteht bei einem DataGrid das Problem bei der Implementierung von ICustomTypeDescriptor , DataGrid über Ihre Eigenschaften zu informieren, dass DataGrid die TypeDescriptors über den Type nicht die Instanz abruft, was ein Problem für dynamische Objekte ist, jedoch ITypedList für die Auflistung von DynamicObjects implementiert wird mit der sehr kleinen Sache von arbeiten, wenn Sie die nicht-generische IList Schnittstelle für Ihre Sammlung nicht implementieren, wird es ausgezogen, bevor es zu dem Punkt kommt, wo es nach ITypeList sucht.

Zusammenfassend implementieren Sie eine Sammlung mit ITypedList und IList . Mit ITypedList geben Sie null für GetListName zurück und implementieren nur GetItemProperties(PropertyDescriptor[] listAccessors) ; Ignoriere listAccessors und gebe eine PropertyDescriptorCollection von PropertyDescriptors für jedes Member zurück, das basierend auf der am besten dargestellten dynamischen Objektinstanz in deiner Liste benannt wurde (höchstwahrscheinlich nur das erste Objekt). Sie müssen eine Unterklasse von PropertyDescriptor implementieren, ein einfacher und allgemeiner Weg zum Get / Set-Wert besteht darin, das Opensource-Framework Dynamite zu verwenden

%Vor%     
jbtule 14.03.2011, 13:39
quelle
2

Ich denke, die DataGrid verwendet TypeDescriptor , um die Objekteigenschaften zum Erstellen der Spalten zu erhalten. Das solltest du also erreichen können, wenn dein DynamicObject ICustomTypeDescriptor implementiert. Implementieren Sie die GetProperties -Methode, sodass sie die dynamischen Eigenschaften Ihres Objekts zurückgibt.

    
Thomas Levesque 20.08.2010 01:37
quelle