2011-06-22 104 views
1

我正在尝试做一个预算程序。我需要在里面放置文本框列表的groupbox。与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> 

我需要某种方式与groupboxes数据绑定列表(也许?),所以我想创建的组框列表,里面有些线将与货币值的文本。所以我可以创建一个名为“公寓”的小组,有两行“Rent $ 3000”和“Maintenance $ 150”。然后我可以有一个名为“Car”的第二组,例如“Insurance”,“Loan”和“Maintenance”。

但是,我会怎样绑定这个?我将如何在C#中执行此操作。我很茫然。

+1

你为什么不创建一个模型来组织你的数据更像你正在寻找的,然后创建一个你可以更容易地绑定到的模板? – Jay

回答

5

建立在Jay的评论之外,你会想创建一个Hierarchical数据模型。请注意我已经留在性能执行INotifyPropertyChanged的你

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

那么你的数据的模板应该是这样的:

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

一个汽车可能看起来像:

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

那么你的ItemsControl可以这样设置:

<ItemsControl ItemSource="{Binding BudgetItems}"> 

的将根据数据类型挑选正确的DataTemplate。您可以通过创建自定义DataTemplateSelector来进行更多的控制。

查看https://msdn.microsoft.com/en-us/library/ms742521(v=vs.100).aspx了解更多信息。