Pregunta

He creado un MVVM sencillo, con sólo tres clases CashFlowView, CashFlowViewModel, CashFlowModel.

Yo uso de un 9,1 XamDataPresenter infragistic (o xamDataGrid).

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

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

Dentro de mi modelo de vista:

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

modelo de vista está conectado para ver este:

this.DataContext = new CashflowViewModel();

Mientras conecto la rejilla a la ObjectDataProvider su fina que funciona perfectamente. Pero me hubiera gustado que sólo pudiera conectarse a una propiedad dentro de mi modelo de vista en su lugar.

De acuerdo con Infragistics todo lo que tengo que hacer es lo siguiente:

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

Sin embargo, en este caso parece que tengo que se unen a una colección de otro modelo de vista para representar mis filas dentro de la cuadrícula. Y ahí es donde me confundo.

He intentado esto y no funciona:

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

En el interior del modelo de vista:

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

Pero, ¿cómo puedo crear mi segundo modelo de vista (CashflowDataGridViewModel)?

He intentado añadir esta proprty dentro de este segundo modelo de vista:

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

Sin embargo, lo único que consigue mostrado en mi punto de vista es cabecera de la columna "Flujo de caja" sin ninguna de las cabeceras subyacentes de la clase cashflowModel real.

¿Fue útil?

Solución

Para ser capaz de obligar a la vista de propiedades en el modelo de vista, el DataContext necesita ser ajustado a una instancia de su modelo de vista. Lo que habitualmente hago es para incluir la línea siguiente en el constructor del código subyacente para mi Ver:

this.DataContext = new SomeAwesomeViewModel();

También puede establecer el DataContext para los contenedores si quieres diferentes grupos de controles para utilizar diferentes ViewModels (por ejemplo, Grid.DataContext, StackPanel.DataContext, etc.).

Una vez que tenga el conjunto DataContext, usted debe ser capaz de unirse a las propiedades de ese modelo de vista.

Actualizar

Aquí hay un poco de código de ejemplo para que te va.

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

Esa es la propiedad que debe proporcionar los datos para la cuadrícula de datos. Ahora, esto es lo que la clase FlowViewModel podría parecer.

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));
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top