我正在尝试制定预算计划。我需要在哪里放置带有文本块列表的分组框。
<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>
我需要以某种方式将一个列表(可能是?)与组框进行数据绑定,这样我就可以创建一个组合框列表,其中一些行是一个带有货币值的文本。这样我就可以创建一个名为“Apartment”的组,其中包含两行“Rent $ 3000”和“Maintenance $ 150”。然后,我可以建立一个名为“Car”的第二组,例如“保险”,“贷款”和“维护”。
但我怎么会这个数据包呢?我将如何在C#中执行此操作。我很茫然。
答案 0 :(得分: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>
答案 1 :(得分: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。