Domanda

Devo creare un XamDataGrid che mostri una quantità dinamica di colonne per un intervallo di tempo da x a y.Pertanto non so per quanti anni un utente sceglierebbe di creare queste colonne in anticipo.

Ora di solito all'interno di MVVM dovresti semplicemente popolare i dati attraverso tutte le proprietà di cui avresti bisogno nelle colonne all'interno del tuo XamDataGrid e quest'ultimo li genererebbe automaticamente.

Ovviamente non potevo semplicemente creare proprietà all'interno del mio ViewModel in fase di runtime a meno che non facessi qualcosa di folle con Reflection.

In quale altro modo potrei raggiungere questo obiettivo?

Dovrei semplicemente creare campi non associati per il datagrid e compilarli tramite il codice?Sono d'accordo che non avrò bisogno di un collegamento bidirezionale in questa fase, poiché la griglia è di sola lettura... sto solo pensando ad alta voce.

Questo approccio è OK senza violare il modello MVVM?Grazie

È stato utile?

Soluzione

Puoi utilizzare gli indicizzatori:

Nel tuo ViewModel:

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

In MyVariableCollection:protetto SomeRowViewModel viewModel;

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

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

Ho cercato di essere breve:ma l'idea è che hai una nuova classe con un indicizzatore definito, quindi puoi associarla in questo modo:

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

La raccolta di colonne sul controllo griglia dati verrebbe associata e potresti impostare un modello di colonna per ciascuna colonna da associare alla colonna in questione;non è necessario utilizzare una stringa letterale nell'indicizzatore in questo modo.

Spero che questo fornisca qualche spunto di riflessione: per qualsiasi domanda su questo percorso si prega di lasciare un commento.


Modifica per un ulteriore pensiero:Ho utilizzato i contenuti ComponentModel spazio dei nomi per produrre un file personalizzato TypeDescriptor.È abbastanza approfondito ma puoi far "sembrare" che un oggetto abbia proprietà aggiuntive o personalizzate.È molto più complesso del metodo dell'indicizzatore che ho pubblicato sopra, ma se rimani bloccato vale la pena dargli un'occhiata.

Altri suggerimenti

Ho avuto un problema simile perché l'utente è in grado di definire le colonne della griglia in fase di esecuzione.

ho scritto un controllo che contiene il DataGrid XAM ed esponendo una proprietà DataSource di dipendenza per legare il modello per la griglia (vale a dire una tabella di dati).

Ogni volta che cambiate la fonte (è possibile aggiungere listener di eventi per PropertyChanged e le griglie FieldLayoutInitializing eventi) la griglia è stata dinamicamente ri-reso deselezionando la sua DataSource e resettarlo:

private void ReRenderGrid()
{
    XamDataGrid.FieldLayouts.Clear();
    XamDataGrid.ClearValue(DataPresenterBase.DataSourceProperty);
    XamDataGrid.DataSource = DataSource.Data.DefaultView;
}

Le colonne sono ri configurato da un gestore di eventi sul seguente evento che sia sollevata dal xamdatagrid dopo l'griglie origine dati viene azzerato:

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));
}

Nel mio caso l'origine dati contiene tutte le colonne l'utente configurato. AddFields chiama questo metodo per ogni voce della 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 e AddUnboundField sono implementate in modo simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top