2009-07-30 11 views
0

は、現在、私のモデルは、我々の目的のために、ここで私はAnnualizedRate1AnnualizedRate2、...、AnnualizedRate10 10のプロパティRate1経由ビューモデルにビューに明らかにされ、Rate2と呼ぶことにします10の特性を有しています。 ..、Rate10。私の意見の1つは、これらの値をDataGridに示しています。これは非常に反復的であり、変化する要件に適応する痛みです。次のよりも良い方法が必要です。WPF繰り返し質問(MVVM)

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

ビュー(MyView):

モデル(MyModel):MyModel.AnnualizedRate

public decimal AnnualizedRate(int i); 

ビューモデル(MyViewModel)である

public decimal AnnualizedRate1 { get { return this.AnnualizedRate(1); } } 
public decimal AnnualizedRate2 { get { return this.AnnualizedRate(2); } } 
... 
public decimal AnnualizedRate10 { get { return this.AnnualizedRate(10); } } 
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> 

誰にでもアイデアはありますか?

+0

正確に何が反復的であるか - これらの10のプロパティごとに個別に列を定義してバインドする必要がありますか?それはあなたが取り除きたいものですか? –

+0

彼はRate1からRate10まで同じxamlを繰り返しコピーして貼り付け、そのインデックス番号を変更する必要があると言っています。 DataGrid.ColumnsプロパティにあるDataGridTextColumnのすべてであると判断して、10列のグリッドを持っていると仮定し、列のコードをより簡潔にする方法と同じです。 –

+0

@Anderson Imes:あなたは問題と目標を正しく理解しています。 – jason

答えて

1

私はObservableCollectionを使ってデータを保存し、グリッドをバインドします。

+0

詳しい説明をしてください。私はこれを使用する方法を見ていない。 – jason

+2

私はなぜ彼がdownvoted得たか分からない。これは正解です。私はあなたのためのコードを書くだろうが、それは彼をdownvoteするちょっとしたことだった。 –

+0

@アンダーソン・イメス:私のものではない。 – jason

4

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ツールキットはこれを簡単にはしないので、ObservableCollection<AnnualizedRateViewModel>ObservableCollection<DataGridColumn>に変換する値コンバータを作成する必要があります。

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

ここで学ぶべきことは、自分自身を「繰り返し」と考えているときに、代わりに「コレクション」と考えることです。

幸運を祈る...そしてまた、クレジットRB Davidson。

+0

私はdavidsonが項目の代わりにバインド列を意味するのかどうかはわかりません。少なくとも彼の答えはこれに言及していません。 –

+0

私は暗黙のように見ました。戦略は健全で、彼は下降音のすべてに値しませんでした。明確化のための質問はうまくいきますが、彼はまた、私は少し厳しいと思うdownvotedされました。 –

+0

私は非常に誤解される可能性がありますが、WPF ToolkitのDataGrid.ColumnsプロパティにItemsControlプロパティが含まれているとは思われません。 GridViewとDataGridを混同していると思います。もし私が間違っているなら、私を許してください。 – jason