Pregunta

Tengo que crear un XamDataGrid que muestra una cantidad dinámica de columnas para un marco de tiempo x a y. Por lo tanto, no sé cuántos años, un usuario podría seleccionar que estas columnas adelantado creado.

Ahora usualy dentro MVVM que acaba de rellenar los datos a través de todas las propiedades que se necesitaría Columnas dentro de su XamDataGrid, y éste acaba de autogenerar ellos.

Obviamente, podría no sólo crear propiedades dentro de mi modelo de vista en tiempo de ejecución a menos que hice algo loco con la reflexión.

¿Cómo si no iba a lograr esto?

¿Debo crear campos no consolidados para la cuadrícula de datos y llenar a través de código? Estoy de acuerdo en que no necesitará una unión de dos vías en esta etapa, ya que la red sólo es de sólo lectura ... sólo de pensar en voz alta.

¿Es este enfoque Aceptar sin violar el patrón MVVM? Gracias

¿Fue útil?

Solución

Se puede usar controladores paso a paso:

En el modelo de vista:

public MyVariableCollection RowData
{
    get { return new MyVariableCollection(this); }
}

En MyVariableCollection:     protegida SomeRowViewModel modelo de vista;

public MyVariableCollection(SomeRowViewModel viewmodel)
{
    this.viewModel = viewmodel;
}

public object this[string name]
{
    get { return viewModel.GetRowColumnValue(name); }
}

He tratado de ser breve, pero la idea es que tienes una nueva clase con un indexador definido, entonces se puede unir de esta manera:

{Binding Path=SomeRowViewModelInstance.RowData["ColumnName"]}

La colección de columnas en el control de la red de datos estaría obligado - y se podría establecer una plantilla de cada columna para unirse a la columna en cuestión; No es necesario utilizar una cadena literal en el indexador de esa manera.

La esperanza que ofrece algunos elementos de reflexión -. Alguna pregunta sobre esta ruta por favor deje un comentario


Editar para un pensamiento adicional: he utilizado el contenido del espacio de nombres ComponentModel para producir un TypeDescriptor personalizado. Es bastante a fondo, pero se puede hacer que un objeto 'aparecen' que tienen propiedades adicionales o personalizados. Es mucho más complejo que el método paso a paso que he publicado anteriormente, pero si te quedas atascado vale la pena un vistazo.

Otros consejos

I tenía un problema similar ya que el usuario era capaz de definir las columnas de la cuadrícula en tiempo de ejecución.

I escribió un control que contiene la cuadrícula de datos Xam y exponer una propiedad de dependencia DataSource para enlazar el modelo para la red (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 forma dinámica re-prestados 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 son re configurado por un controlador de eventos en el siguiente evento que se eleva por xamdatagrid después de que el origen de datos de las redes se pone a cero:

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 la fuente de datos contiene todas las columnas del usuario configurado. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top