DataGrid具有DataGrid,用于WPF中第n级的单元格

时间:2013-06-27 10:00:33

标签: c# .net wpf xaml wpfdatagrid

我需要创建一个DataGrid来显示WPF中的对象集合。 该集合在运行时出现,并且在大多数情况下都是不同的。

对象的属性可以进一步是一个集合。因此每个单元格应该能够自己显示一个子DataGrid,并且这可以扩展到第n级。

如何在WPF中创建这样的DataGrid?

3 个答案:

答案 0 :(得分:1)

您可以使用datagrid控件,并可以将其itemsource设置为您希望在每行中显示的可观察数据集合。对于每一行,您还可以根据需要设置其内容模板。此内容模板的控件数据也可以使用绑定进行设置。

答案 1 :(得分:1)

您可以使用分层数据模板来实现此目的。

例如,请参阅以下MVVM模式代码。

Model.cs

public class Person
{
    ObservableCollection<Person> MyCollection {get; set;}
}

ViewModel.cs

public class PersonModel
{
    ObservableCollection Collection {get; set;}
}

XAML代码(查看)

<Window.DataContext>
    <local:PersonModel/>
</Window.DataContext>
<Grid>
    <DataGrid  ItemsSource="{Binding Collection}" >
        <DataGrid.RowDetailsTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding SelectedItem.MyCollection}">
                <DataGrid RowDetailsTemplate="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}},Path=RowDetailsTemplate}" ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}},Path=SelectedItem.MyCollection}">                   
                </DataGrid>
            </HierarchicalDataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>
</Grid>

希望这会对你有帮助.....

答案 2 :(得分:1)

如果所有数据都是动态的,那么我会说推荐的方法是在代码隐藏时创建你的DataGrid,并根据你的需要填充它的列。我认为有一个DataGridTemplateColumn 1课程可以帮助您。您可以通过DataTemplate属性为此列分配CellTemplate

您可以通过XAML或代码隐藏创建DataTemplate。当然,该模板可以包含DataGrid。您将无法对DataGridTemplateColumn本身进行数据绑定,但您可以在DataTemplate内对数据进行数据绑定。

DataGridTemplateColumn at MSDN

示例

这是一个如何在XAML中执行此操作的简单示例,就像我说如果您需要动态数据网格,那么您必须在代码隐藏中执行此操作。我希望这会有所帮助。

Example

<强> MainWindow.xaml

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:System="clr-namespace:System;assembly=mscorlib" x:Class="TestStackoverflow.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid>
            <Grid.Resources>
                <!--DataTemplate for Published Date column defined in Grid.Resources.  PublishDate is a property on the ItemsSource of type DateTime -->
                <DataTemplate x:Key="DateTemplate" >
                    <DataGrid AutoGenerateColumns="False" >
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Second grid column" Binding="{Binding ''}" ClipboardContentBinding="{x:Null}"/>
                        </DataGrid.Columns>
                        <System:String>I heard you like</System:String>
                        <System:String>datagrids so</System:String>
                        <System:String>I put a datagrid in</System:String>
                        <System:String>your data datagrid</System:String>
                        <System:String>so you can grid while you grid.</System:String>
                    </DataGrid>
                </DataTemplate>
            </Grid.Resources>
            <DataGrid AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Original Datagrid DG Column" CellTemplate="{StaticResource DateTemplate}" />
                    <DataGridTextColumn Header="Original Datagrid Text Column" Binding="{Binding ''}" ClipboardContentBinding="{x:Null}"/>
                </DataGrid.Columns>
                <System:String>String 1</System:String>
                <System:String>String 2</System:String>
                <System:String>String 3</System:String>
                <System:String>String 4</System:String>
                <System:String>String 5</System:String>
            </DataGrid>
        </Grid>
    </Grid>
</Window>