edit : sorry, ich habe den unten genannten code nicht mehr. Es war eine saubere Lösung, obwohl komplex.
Ich habe ein Beispielprojekt veröffentlicht, in dem beschrieben wird, wie PropertyDescriptor- und Lambda-Delegaten mit dynamischer ObservableCollection und DynamicObject verwendet werden, um ein Raster mit stark typisierten Spaltendefinitionen zu füllen .
Spalten können zur Laufzeit dynamisch hinzugefügt / entfernt werden . Wenn Ihre Daten kein Objekt mit bekanntem Typ sind, können Sie eine Datenstruktur erstellen, die den Zugriff für eine beliebige Anzahl von Spalten ermöglicht, und für jede "Spalte" einen PropertyDescriptor angeben.
Zum Beispiel:
IList<string> ColumnNames { get; set; }
Dictionary<string, string> Rows { get; set; }
Sie können Spalten folgendermaßen definieren:
var descriptors= new List<PropertyDescriptor>();
foreach(var columnName in ColumnNames)
descriptors.Add(new DynamicPropertyDescriptor<Dictionary, string>(ColumnName, x => x[columnName]))
MyItemsCollection = new DynamicDataGridSource(Rows, descriptors)
Oder noch besser bei einigen realen Objekten
public class User
{
public string FirstName { get; set; }
public string LastName{ get; set; }
...
}
Sie können stark typisierte Spalten angeben (bezogen auf Ihr Datenmodell):
var propertyDescriptors = new List<PropertyDescriptor>
{
new DynamicPropertyDescriptor<User, string>("First name", x => x.FirstName ),
new DynamicPropertyDescriptor<User, string>("Last name", x => x.LastName ),
...
}
var users = retrieve some users
Users = new DynamicDataGridSource<User>(users, propertyDescriptors, PropertyChangedListeningMode.Handler);
Dann binden Sie einfach an Benutzer Sammlungen und Spalten werden automatisch generiert, wenn Sie sie spezifizieren. An Eigenschaftsbeschreibungen übergebene Zeichenfolgen sind Namen für Spaltenüberschriften. Zur Laufzeit können Sie den 'Benutzern' weitere PropertyDescriptors hinzufügen und dem Raster eine weitere Spalte hinzufügen.