Редактировать: извините, у меня больше нет кода, упомянутого ниже. Это было аккуратное решение, хотя и сложное.
Я опубликовал пример проекта, описывающий, как использовать 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, чтобы «Пользователи» добавили еще один столбец в сетку.
-1: потому что вы показываете мучительно легкую часть, но не так, как на самом деле привязать данные к этим во время выполнения добавлены столбцы. Я уверен, что Энди хочет создать приложение, которое отображает какие-то данные, а не только имена столбцов. – JohnB
Речь идет только о настройке свойств в DataGridTextColumn. Я обновил ответ. –
+1: Я подтвердил, что работает, спасибо. Я также обнаружил, что когда вы добавляете квадратные скобки, то есть 'Binding (" [FirstName] ")' *, см. Мой предыдущий ответ ниже *, что он работает, но он значительно медленнее при привязке больших наборов данных. – JohnB