2011-06-22 17 views
1

私は予算プログラムを作ろうとしています。私は、内部にテキストブロックのリストを持つグループボックスを持つ必要があります。WPFとC#でネストされたデータバインディング

<ItemsControl DataContext="{Binding}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <GroupBox Header="{Binding}"> 
     <ItemsControl DataContext="{Binding}"> 
      <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Text}" /> 
       <TextBlock Text="{Binding Value}" /> 
       </StackPanel> 
      </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
     </GroupBox> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

私は(おそらく?)リストをデータバインドするために何らかの形で必要なグループボックスを持つ私は、通貨の値を持つテキストであろうと内側にいくつかの行で、グループボックスのリストを作成したいので。私は、 "Rent $ 3000"と "Maintenance $ 150"という2つの行を持つ "Apartment"というグループを作ることができました。次に、 "保険"、 "融資"、 "保守"などの行を持つ "車"と呼ばれる第2のグループを持つことができます。

これはどのようにデータバインドしますか?そして、これを実行するにはどのようにC#で必要となるでしょうか。私は迷っている。

+1

探しているもののようにデータを整理するモデルを作成してから、より簡単にバインドできるテンプレートを作成するのはなぜですか? – Jay

答えて

5

Jayのコメントを除いて、階層的なデータモデルを作成することをお勧めします。私はその後、あなたのデータテンプレートは次のようになりますあなたに性質上

public class BudgetLineItem : INotifyPropertyChanged 
{ 
    public string Name { get; set; } 
    public decimal Cost { get; set; } 
} 

public class BudgetGroup : INotifyPropertyChanged 
{ 
    public string GroupName { get; set; } 
    public ObservableCollection<BudgetLineItem> LineItems { get; set; } 
} 

public class BudgetViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<BudgetGroup> BudgetGroups { get; set; } 
} 

をINotifyPropertyChangedのを実装残した注意:

<ItemsControl DataContext="{Binding ViewModel}" 
       ItemsSource="{Binding BudgetGroups}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <GroupBox Header="{Binding GroupName}"> 
     <ItemsControl ItemsSource="{Binding LineItems}"> 
      <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}" /> 
       <TextBlock Text="{Binding Cost}" /> 
       </StackPanel> 
      </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
     </GroupBox> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
0

私はここにベースから外れかもしれないが、あなたが変更したいように聞こえますDataTemplateは、異機種オブジェクトのリストからバインドされているオブジェクトの型に基づいています。

この場合、DataTemplateSelectorsを調べるか、リストでサポートするタイプごとにDataTemplatesを作成する必要があります。例えば

、あなたが持つかもしれないアパートのために:

<DataTemplate DataType="local:ApartmentBudget"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock Text="{Binding Text}" /> 
    <TextBlock Text="{Binding Value}" /> 
    </StackPanel> 
</DataTemplate> 

カーのように見えることがあります。

<ItemsControl ItemSource="{Binding BudgetItems}"> 

<DataTemplate DataType="local:CarBudget"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock Text="{Binding Insurance}" /> 
    <TextBlock Text="{Binding Loan}" /> 
    <TextBlock Text="{Binding Maintenance}" /> 
    </StackPanel> 
</DataTemplate> 

次に、あなたのItemsControlには次のように設定することができますデータ型に基づいて正しいDataTemplateが選択されます。カスタムのDataTemplateSelectorを作成することで、より多くの制御を行うことができます。

詳細については、https://msdn.microsoft.com/en-us/library/ms742521(v=vs.100).aspxを参照してください。

関連する問題