Вопрос повторения WPF (MVVM) - PullRequest
0 голосов
/ 30 июля 2009

В настоящее время моя модель имеет десять свойств, которые для наших целей я назову 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>

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

Ответы [ 2 ]

4 голосов
/ 30 июля 2009

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

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

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

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

1 голос
/ 30 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...