Tuve un problema similar porque el usuario pudo definir las columnas de la cuadrícula en tiempo de ejecución.
Escribí un control que contiene la cuadrícula de datos xam y expongo una propiedad de dependencia de DataSource para vincular el modelo a la grilla (es decir, una tabla de datos).
Cada vez que cambia la fuente (se puede añadir detectores de eventos para PropertyChanged y las rejillas de eventos FieldLayoutInitializing) que la red se dinámicamente volver a representar en la limpieza de su fuente de datos y ponerlo a cero:
private void ReRenderGrid()
{
XamDataGrid.FieldLayouts.Clear();
XamDataGrid.ClearValue(DataPresenterBase.DataSourceProperty);
XamDataGrid.DataSource = DataSource.Data.DefaultView;
}
Las columnas se vuelven a configurar por un controlador de eventos en el siguiente suceso que se eleva por xamdatagrid después de la fuente de datos rejillas se restablece:
XamDataGrid.FieldLayoutInitializing += LayoutInitializing;
Handler:
private void LayoutInitializing(object sender, FieldLayoutInitializingEventArgs e)
{
const string deletebuttonstyle = "DeleteButtonStyle";
const string requiredinputvalue = "RequiredInputValue";
const string optionalinputvalue = "OptionalInputValue";
const string outputvalue = "OutputValue";
var fieldLayout = e.FieldLayout;
fieldLayout.Fields.Clear();
AddFields(DataSource.InColumns, requiredinputvalue, fieldLayout);
AddSplitter(fieldLayout);
AddFields(DataSource.OptionalInColumns, optionalinputvalue, fieldLayout);
AddSplitter(fieldLayout);
AddFields(DataSource.OutColumns, outputvalue, fieldLayout);
AddUnboundField(fieldLayout, string.Empty, GetStyle(deletebuttonstyle));
}
En mi caso, el origen de datos contenía todas las columnas configuradas por el usuario. AddFields llama a este método para cada entrada de la lista:
private void AddField(string name, Style style, FieldLayout fieldLayout)
{
var field = new Field {Name = name};
field.Settings.LabelPresenterStyle = style;
field.Settings.CellValuePresenterStyle = GetStyle("StandardCellValueStyle");
fieldLayout.Fields.Add(field);
}
AddSplitter y AddUnboundField se implementan de una manera similar.
Gracias por su gran respuesta Kieren. Aunque encontré tres problemas con tu modelo. Primero está la propiedad RowData de ViewModel, que está pasando en su propio código un 'esto'. Sin embargo, el ctor real acepta un tipo de SomeRowViewModel que no es compatible con el tipo de 'this' anterior. – Houman
El segundo problema es la forma en que se vincula una sola columna. Dentro de XamDataGrid normalmente vincularía toda la xamdatagrid simplemente a una colección BindingList y una dit generaría automáticamente esas filas. A menos que cree las columnas manualmente, no podrá vincularlas a cada columna por separado. –
Houman
El tercer problema es el siguiente: podría autogenerar los columnNames dinámicamente para timeperiod x a y, para poder usarlos en el indexador como sugirió. Pero el enlace no puede estar todavía en el código xaml estático. Más tiene que estar en el código detrás de la vista xaml para usar los nombres de las columnas de una manera variable. A menos que me falta algo aquí ... Gracias – Houman