J'ai posté un projet d'exemple décrivant comment utiliser PropertyDescriptor et délégués lambda avec ObservableCollection et DynamicObject dynamiques pour remplir une grille avec fortement typé les définitions des colonnes.
Les colonnes peuvent être ajoutées/supprimées au moment de l'exécution. dynamiquement . Si vos données ne sont pas un objet de type connu, vous pouvez créer une structure de données permettant un accès par un nombre quelconque de colonnes et spécifier un PropertyDescriptor pour chaque "colonne".
Par exemple :
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
Vous pouvez définir des colonnes de cette manière :
var descriptors= new List<PropertyDescriptor>();
//retrieve column name from preprepared list or retrieve from one of the items in dictionary
foreach(var columnName in ColumnNames)
descriptors.Add(new DynamicPropertyDescriptor<Dictionary, string>(ColumnName, x => x[columnName]))
MyItemsCollection = new DynamicDataGridSource(Rows, descriptors)
Ou encore mieux, dans le cas de certains objets réels
public class User
{
public string FirstName { get; set; }
public string LastName{ get; set; }
...
}
Vous pouvez spécifier des colonnes fortement typées (liées à votre modèle de données) :
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);
Il suffit ensuite de lier les collections d'utilisateurs et les colonnes sont générées automatiquement au fur et à mesure que vous les spécifiez. Les chaînes transmises aux descripteurs de propriétés sont les noms des en-têtes de colonnes. Au moment de l'exécution, vous pouvez ajouter d'autres PropertyDescriptors à 'Users' pour ajouter une autre colonne à la grille.