edit : вибачте, у мене вже немає коду, згаданого нижче. Це було акуратне рішення, хоч і складне.
Я опублікував зразок проекту, що описує, як використовувати PropertyDescriptor та лямбда-делегати з динамічними ObservableCollection та DynamicObject для заповнення сітки з сильно набраними визначеннями стовпців.
Стовпці можна додавати / видаляти під час виконання динамічно . Якщо ваші дані не є об'єктом з відомим типом, ви можете створити структуру даних, яка дозволить доступ за будь-якою кількістю стовпців і вказати PropertyDescriptor для кожного "стовпця".
Наприклад:
IList<string> ColumnNames { get; set; }
Dictionary<string, string> Rows { get; set; }
Ви можете визначити стовпці таким чином:
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)
Або ще краще, у випадку якихось реальних об’єктів
public class User
{
public string FirstName { get; set; }
public string LastName{ get; set; }
...
}
Ви можете вказати стовпці, що сильно набираються (пов'язані з вашою моделлю даних):
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);
Потім ви просто прив'язуєтесь до колекцій користувачів і стовпці автоматично генеруються, коли ви їх визначаєте. Рядки, передані дескрипторам властивостей, є іменами заголовків стовпців. Під час виконання ви можете додати більше PropertyDescriptors до 'Користувачі', додати ще один стовпець до сітки.