Question
Actuellement, mon modèle a dix propriétés qui, pour ce faire, seront appelées AnnualizedRate1
, AnnualizedRate2
, ..., AnnualizedRate10
, qui sont révélé aux vues dans le modèle de vue via dix propriétés Taux1
, Taux2
, ..., Taux10
. L'un de mes points de vue montre ces valeurs dans un DataGrid
. C'est terriblement répétitif et il est difficile de s'adapter à l'évolution des besoins. Il doit y avoir un meilleur moyen que le suivant.
Modèle ( 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); } }
où MyModel.AnnualizedRate
est
public decimal AnnualizedRate(int i);
Modèle de vue ( MyViewModel
):
public decimal Rate1 { get { return myModel.AnnualizedRate1; } }
public decimal Rate2 { get { return myModel.AnnualizedRate2; } }
...
public decimal Rate10 { get { return myModel.AnnualizedRate10; } }
Afficher ( 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>
Quelqu'un a-t-il des idées?
La solution
Je voudrais utiliser et ObservableCollection pour stocker les données et lier la grille.
Autres conseils
Voici le code pour faire ce que RB Davidson a dit de faire. Lorsque vous trouvez que cela fait ce que vous vouliez, donnez-lui un crédit. Sa réponse est correcte.
Dans votre modèle de vue:
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
}
}
}
À partir de là, vous utiliseriez la liaison de données pour créer les colonnes dans votre vue. Vous souhaitez vous connecter à cette collection de taux annualisés. Comme WPF Toolkit ne vous facilite pas la tâche, vous devrez écrire un convertisseur de valeur pour convertir le ObservableCollection & Annual DirectoryRateViewModel >
en un ObservableCollection < DataGridColumn >
. . p>
<dg:DataGrid AutoGenerateColumns="false" Columns="{Binding AnnualizedRates, ValueConverter={StaticResource AnnualizedRatesToDataGridColumnCollectionConverter}}">
</dg:DataGrid>
Ce que vous devez apprendre ici, c’est lorsque vous pensez à vous-même "répétition", essayez plutôt de penser à "collection".
Bonne chance ... et encore, crédit RB Davidson.