Pregunta

Actualmente mi modelo tiene diez propiedades que para nuestros propósitos aquí llamaré AnnualizedRate1 , AnnualizedRate2 , ..., AnnualizedRate10 , que son revelado a vistas en el modelo de vista a través de diez propiedades Rate1 , Rate2 , ..., Rate10 . Una de mis vistas muestra estos valores en un DataGrid . Esto es terriblemente repetitivo y un dolor para adaptarse a los requisitos cambiantes. Tiene que haber una manera mejor que la siguiente.

Modelo ( MyModel ):

public decimal AnnualizedRate1 { get { return this.AnnualizedRate(1); } }
public decimal AnnualizedRate2 { get { return this.AnnualizedRate(2); } }
...
public decimal AnnualizedRate10 { get { return this.AnnualizedRate(10); } }

donde MyModel.AnnualizedRate es

public decimal AnnualizedRate(int i);

Ver modelo ( MyViewModel ):

public decimal Rate1 { get { return myModel.AnnualizedRate1; } }
public decimal Rate2 { get { return myModel.AnnualizedRate2; } }
...
public decimal Rate10 { get { return myModel.AnnualizedRate10; } }

Ver ( MyView ):

xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
...
    <dg:DataGrid>
        <dg:DataGrid.Columns>
            <dg:DataGridTextColumn
                Header="Rate1" 
                Binding="{Binding Rate1, StringFormat=P}"
                IsReadOnly="True"/>
            <dg:DataGridTextColumn
                Header="Rate2" 
                Binding="{Binding Rate2, StringFormat=P}"
                IsReadOnly="True"/>
            ...
            <dg:DataGridTextColumn
                Header="Rate10" 
                Binding="{Binding Rate10, StringFormat=P}"
                IsReadOnly="True"/>
        </dg:DataGrid.Columns>
    </dg:DataGrid>

¿Alguien tiene alguna idea?

¿Fue útil?

Solución

Usaré y ObservableCollection para almacenar los datos y enlazar la cuadrícula con.

Otros consejos

Aquí está el código para hacer lo que RB Davidson dijo que hiciera. Cuando descubras que esto hace lo que querías, dale crédito. Su respuesta es correcta.

En tu ViewModel:

public class AnnualizedRateViewModel
{
     public string Name { get; set; }
     public decimal Rate { get; set; }
}

public MyViewModel : INotifyPropertyChanged
{

public MyViewModel()
{
     AnnualizedRates = new ObservableCollection<AnnualizedRateViewModel>();
     //I'd recommend your model having a GetAllRates() function rather than this,
     //but for demo purposes, this works
     for(int i = 1; i <= 10; i++)
     {
          AnnualizedRates.Add(new AnnualizedRateViewModel()
          {
               Name = string.Format("Rate {0}", i),
               Rate = MyModel.AnnualizedRate(i)
          });
     }
}

private ObservableCollection<int> _annualizedRates;
public ObservableCollection<int> AnnualizedRates
{
     get { return _annualizedRates; }
     set
     {
          _annualizedRates = value;
          //Raise OnNotifyPropertyChanged event from your
          //implementation of INotifyPropertyChanged in your viewmodel
          //the full implementation of this is outside the scope of this demo
     }
}

}

Desde allí, realmente usarías el enlace de datos para crear las columnas en tu vista. Te unirías a esta colección de AnnualizedRates. Como el Kit de herramientas de WPF no lo hace fácil, deberá escribir un convertidor de valores para convertir ObservableCollection < AnnualizedRateViewModel > en ObservableCollection < DataGridColumn > .

<dg:DataGrid AutoGenerateColumns="false" Columns="{Binding AnnualizedRates, ValueConverter={StaticResource AnnualizedRatesToDataGridColumnCollectionConverter}}">
</dg:DataGrid>

Lo que deberías aprender aquí es cuando piensas para ti mismo " repetición " ;, intenta y en su lugar piensa " colección " ;.

Buena suerte ... y otra vez, crédito RB Davidson.

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