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?
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
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.
Tags und Links wpf data-binding c#-4.0 dynamicobject datagrid