Frage

Zur Zeit mein Modell hat zehn Eigenschaften, die für unsere Zwecke werde ich AnnualizedRate1, AnnualizedRate2 nennen, ..., AnnualizedRate10, die Ansichten in der View-Modell über zehn Eigenschaften ergeben, sind Rate1, Rate2, ..., Rate10. Einer meiner Ansichten zeigt diese Werte in einem DataGrid. Das ist furchtbar repetitive und einen Schmerz an sich ändernde Anforderungen anzupassen. Es muss ein besserer Weg als die folgenden werden.

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

Dabei gilt MyModel.AnnualizedRate ist

public decimal AnnualizedRate(int i);

Ansicht Modell (MyViewModel):

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

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

Hat jemand irgendwelche Ideen?

War es hilfreich?

Lösung

Ich würde verwenden und ObservableCollection die Daten zu speichern und binden, das Netz.

Andere Tipps

Hier ist der Code zu tun, was RB Davidson sagte zu tun. Wenn Sie feststellen, dass dies tut, was Sie wollen, geben Sie bitte ihm Kredit. Seine Antwort ist richtig.

In Ihrem Ansichtsmodell:

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

}

Von dort würden Sie tatsächlich Datenbindung verwenden, um die Spalten in der Ansicht zu erstellen. Sie würden zu dieser Sammlung von AnnualizedRates binden. Da die WPF-Toolkit nicht so einfach machen, erhalten Sie einen Wert Konverter schreiben müssen, um die ObservableCollection<AnnualizedRateViewModel> zu einem ObservableCollection<DataGridColumn> zu konvertieren.

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

Das, was Sie sollten lernen, hier ist, wenn Sie zu sich selbst „Wiederholung“ denken, versuchen und stattdessen denken „Sammlung“.

Viel Glück ... und wieder, Kredit RB Davidson.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top