Domanda

Attualmente il mio modello ha dieci proprietà che per i nostri scopi qui chiamerò AnnualizedRate1 , AnnualizedRate2 , ..., AnnualizedRate10 che sono rivelato alle visualizzazioni nel modello di visualizzazione tramite dieci proprietà Rate1 , Rate2 , ..., Rate10 . Una delle mie visualizzazioni mostra questi valori in un DataGrid . Questo è terribilmente ripetitivo e un dolore adattarsi ai mutevoli requisiti. Deve esserci un modo migliore del seguente.

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

dove MyModel.AnnualizedRate è

public decimal AnnualizedRate(int i);

Visualizza modello ( MyViewModel ):

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

Visualizza ( 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>

Qualcuno ha qualche idea?

È stato utile?

Soluzione

Vorrei utilizzare e ObservableCollection per memorizzare i dati e associare la griglia a.

Altri suggerimenti

Ecco il codice per fare ciò che RB Davidson ha detto di fare. Quando scopri che questo fa quello che volevi, ti preghiamo di dargli credito. La sua risposta è corretta.

Nel tuo 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
     }
}

}

Da lì useresti effettivamente il databinding per creare le colonne nella tua vista. Ti legheresti a questa raccolta di AnnualizedRates. Dato che WPF Toolkit non è così semplice, dovrai scrivere un convertitore di valori per convertire ObservableCollection < AnnualizedRateViewModel > in ObservableCollection < DataGridColumn > .

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

La cosa che dovresti imparare qui è quando pensi a te stesso "ripetizione", prova a pensare invece a "raccolta".

Buona fortuna ... e ancora, credito a RB Davidson.

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