带有WPF和C#的嵌套数据绑定

本文关键字:嵌套 数据绑定 WPF 带有 | 更新日期: 2023-09-27 18:00:20

我正在努力制定一个预算计划。我需要在里面有一个文本块列表的分组框。

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

我需要以某种方式将一个列表(也许是?)与组框数据绑定,这样我就可以创建一个组框列表,其中的一些行将是一个具有货币值的文本。这样我就可以创建一个名为"公寓"的小组,有两行字"租金3000美元"answers"维护150美元"。然后我可以有第二组,名为"汽车",行"保险","贷款"answers"维护"。

但是我该如何对其进行数据绑定呢?我需要如何在C#中执行此操作。我不知所措。

带有WPF和C#的嵌套数据绑定

根据周的评论,您可能想要创建一个层次数据模型。注意,我已将在属性上实现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>

我可能在这里偏离了基础,但听起来你想根据从异构对象列表中绑定的对象类型来更改DataTemplate。

如果是这种情况,您需要查看DataTemplateSelector,或者为列表中要支持的每种类型创建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获取更多信息。