Domanda

Ho creato un semplice MVVM, con solo tre classi CashFlowView, CashFlowViewModel, CashFlowModel.

Io uso 9.1 XamDataPresenter di un infragistic (o xamDataGrid).

    <igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Source={StaticResource CashFlowData}}">

    <ObjectDataProvider x:Key="CashFlowData" ObjectType="{x:Type ViewModel:CashflowViewModel}" MethodName="GetCashFlows" />

Dentro il mio ViewModel:

public ObservableCollection<CashflowModel> GetCashFlows()
        {
            return new ObservableCollection<CashflowModel>() { ... };
        }

ViewModel è collegato a Vista da questa:

this.DataContext = new CashflowViewModel();

Fino a quando mi collego la griglia per la sua raffinata ObjectDataProvider perfettamente funzionante. Ma ho voluto ho potuto solo connettersi a una proprietà nel mio ViewModel, invece.

Secondo Infragistics tutto quello che devo fare è questo:

<igDP:XamDataGrid DataSource="{Binding Path=ViewModelCollection}"/>

Ma in questo caso sembra che ho bisogno di legarsi a una collezione di un altro ViewModel per rappresentare le mie righe all'interno della griglia. E questo è dove mi confondo.

Ho provato questo e non funziona:

<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Path=CashFlows}">

All'interno della ViewModel:

public ObservableCollection<CashflowDataGridViewModel> CashFlows
        {
            get
            {
                return new ObservableCollection<CashflowDataGridViewModel>();
            }
        }

Ma come faccio a creare il mio secondo ViewModel (CashflowDataGridViewModel)?

Ho provato ad aggiungere questo proprty all'interno di questa seconda ViewModel:

public CashflowModel CashFlow
        {
            get
            {
                return new CashflowModel() {...};
            }
        }

Ma tutto quello che ottiene mostrato il mio punto di vista è intestazione di colonna "dei flussi di cassa", senza alcuna delle intestazioni sottostanti della classe cashflowModel reale.

È stato utile?

Soluzione

Per essere in grado di impegnare la vista per proprietà sul ViewModel, il DataContext deve essere impostato a un'istanza del vostro ViewModel. Quello che faccio è comunemente per includere la seguente riga nel costruttore del code-behind per mio punto di vista:

this.DataContext = new SomeAwesomeViewModel();

È anche possibile impostare il DataContext per i contenitori se si desidera che diversi gruppi di controlli per utilizzare diverse ViewModels (ad esempio, Grid.DataContext, StackPanel.DataContext, ecc.).

Una volta che hai il set DataContext, si dovrebbe essere in grado di legarsi alle proprietà di tale ViewModel.

Aggiorna

Ecco un po 'di codice di esempio per farti andare.

public class CashFlowViewModel
{
    public ObservableCollection<FlowViewModel> DataGridData
    {
        get...
    }
}

Questa è la proprietà che dovrebbe fornire i dati per la DataGrid. Ora, ecco ciò che la classe FlowViewModel potrebbe sembrare.

public class FlowViewModel
{
    decimal flowAmount;
    public decimal FlowAmount
    {
        get { return flowAmount; }
        set
        {
            if(flowAmount == value)
                return;

            flowAmount = value;
            NotifyPropertyChanged("FlowAmount");
        }
    }
    .
    .
    .

    private void NotifyPropertyChanged(string propertyName)
    {
        if(PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top