Вопрос

В настоящее время моя модель имеет десять свойств, которые для наших целей здесь я назову AnnualizedRate1 , AnnualizedRate2 , ..., AnnualizedRate10 открывается представлениям в модели представления через десять свойств Rate1 , Rate2 , ..., Rate10 . Одно из моих представлений показывает эти значения в DataGrid . Это ужасно скучно и очень сложно адаптироваться к меняющимся требованиям. Должен быть лучший способ, чем следующий.

Модель ( 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); } }

где MyModel.AnnualizedRate равно

public decimal AnnualizedRate(int i);

Просмотреть модель ( MyViewModel ):

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

Просмотр ( 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>

У кого-нибудь есть идеи?

Это было полезно?

Решение

Я бы использовал и ObservableCollection для хранения данных и привязки сетки к.

Другие советы

Вот код для выполнения того, что сказал RB Davidson. Когда вы обнаружите, что это делает то, что вы хотели, пожалуйста, дайте ему кредит. Его ответ правильный.

В вашей 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
     }
}

}

Оттуда вы фактически используете привязку данных для создания столбцов в вашем представлении. Вы бы связались с этой коллекцией AnnualizedRates. Поскольку WPF Toolkit не делает это простым, вам нужно написать конвертер значений, чтобы преобразовать ObservableCollection < AnnualizedRateViewModel > в ObservableCollection < DataGridColumn > . . р>

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

Здесь вы должны изучить то, что вы думаете про себя «повторение», попробуйте вместо этого подумать «коллекция».

Удачи ... и еще раз, кредит РБ Дэвидсон.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top