edit: lo siento, ya no tengo el código mencionado a continuación. Fue una solución ordenada, aunque compleja.
he publicado un proyecto de muestra que describe cómo utilizar delegados PropertyDescriptor y lambda con ObservableCollection dinámico y DynamicObject para rellenar una cuadrícula con definiciones de columnas de tipo fuerte.
Columnas se pueden agregar/eliminar en el tiempo de ejecución dinámicamente. Si sus datos no son un objeto con un tipo conocido, puede crear una estructura de datos que permita el acceso por cualquier cantidad de columnas y especificar un PropertyDescriptor para cada "columna".
por ejemplo:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
Se pueden definir columnas de esta manera:
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)
O mejor aún, en el caso de algunos objetos reales
public class User
{
public string FirstName { get; set; }
public string LastName{ get; set; }
...
}
Puede especificar columnas fuertemente mecanografiado (relacionado con su modelo de datos):
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);
Luego, solo tiene que enlazar a las colecciones de los usuarios y las columnas se generan automáticamente a medida que las especifique. Las cadenas pasadas a los descriptores de propiedad son nombres para encabezados de columna. En tiempo de ejecución puede agregar más PropertyDescriptors a 'Users' agregue otra columna a la grilla.
-1: debido a que muestran la parte dolorosamente fácil, pero no cómo enlazar los datos en realidad a esas columnas en tiempo de ejecución añadido. Estoy seguro de que Andy quiere construir una aplicación que muestre algún tipo de datos, no solo nombres de columnas. – JohnB
Es solo una cuestión de establecer propiedades en DataGridTextColumn. Actualicé la respuesta. –
+1: Confirmé que funciona, gracias. También descubrí que cuando agrega los corchetes, es decir 'Binding (" [FirstName] ")' * vea mi respuesta anterior a continuación *, que funcione, pero es significativamente más lenta al enlazar grandes conjuntos de datos. – JohnB