WPF DataGrid:将列绑定到源集合的不同级别

时间:2015-02-25 15:29:36

标签: wpf mvvm data-binding datagrid wpfdatagrid

如何绑定WPF DataGrid以获得以下结果:http://i.stack.imgur.com/7Wne0.png

请注意左侧所需的+/-按钮 DataGrid的ItemsSource绑定到IEnumerable of Document。

问题是如何定义列,以便它们绑定到第二级和第三级对象并获得展开/折叠按钮。
我不希望在父级的RowDetail中定义的Group和Field项目有第二个和第三个网格。
目标是拥有一个DataGrid,一行列标题以及扩展当前行的子元素(如果有)的能力。

public class Document
{
    public string Name { get; set; }
    public IEnumerable<Group> Groups { get; set; }
}

public class Group
{
    public string Name { get; set; }
    public IEnumerable<Field> Fields { get; set; }
}

public class Field
{
    public string Name { get; set; }
    public FieldType FieldType { get; set; }
    public bool IsRequired { get; set; }
}

2 个答案:

答案 0 :(得分:0)

只需绑定到属性即{Binding Document.Group.Name}。

请注意,所有类都必须实现INotifyPropertyChanged。所有属性都应该引发广泛记录的PropertyChanged。 您的馆藏应该是ObservableCollections。

答案 1 :(得分:0)

我在这里找到的唯一技巧是使用带有模板列的嵌套数据网格,没有用于平滑视图的标题。

在代码中:

DocumentGrid.ItemsSource = YourDocument;

XAML:

<DataGrid x:Name="DocumentGrid" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Name}" Header="Document"/>
    <DataGridTemplateColumn Header="Group       Field      FieldType  IsRequired">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <DataGrid x:Name="dgInner" ItemsSource="{Binding Groups}" AutoGenerateColumns="False"  GridLinesVisibility="None" BorderThickness="0" HeadersVisibility="None">
            <DataGrid.Columns>
              <DataGridTextColumn Header="Group" Binding="{Binding Name}"/>

              <DataGridTemplateColumn Header="Field">
                <DataGridTemplateColumn.CellTemplate>
                  <DataTemplate>
                    <DataGrid x:Name="dgInnerInner" ItemsSource="{Binding Fields}" AutoGenerateColumns="False" GridLinesVisibility="None"  BorderThickness="0" HeadersVisibility="None">

                      <DataGrid.Columns>
                        <DataGridTextColumn Header="Field" Binding="{Binding Name}"/>
                        <DataGridTextColumn Header="FieldType" Binding="{Binding FieldType}"/>
                        <DataGridTextColumn Header="IsRequired" Binding="{Binding IsRequired}"/>
                      </DataGrid.Columns>

                    </DataGrid>
                  </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
            </DataGrid.Columns>

          </DataGrid>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

  </DataGrid.Columns>

</DataGrid>

EDIT 如果你想要+ - 按钮来折叠细节你应该使用DataGrid的RowDetailsTemplate,如描述here