edit : извините, у меня больше нет кода, упомянутого ниже. Это было аккуратное решение, хотя и сложное.
Я опубликовал пример проекта, описывающий, как использовать PropertyDescriptor и лямбда-делегаты с динамическими ObservableCollection и DynamicObject для заполнения сетки строго типизированными определениями столбцов.
Столбцы могут быть добавлены / удалены во время выполнения динамически . Если ваши данные не являются объектами с известным типом, вы можете создать структуру данных, которая обеспечит доступ к любому количеству столбцов и указать PropertyDescriptor для каждого «столбца».
Например:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
Вы можете определить столбцы следующим образом:
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)
Или даже лучше, в случае некоторых реальных объектов
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 в «Пользователи», добавить еще один столбец в сетку.