2013-06-27 51 views
2

高达第n层细胞,我需要创建一个DataGrid WPF中显示对象的集合。 收集在运行时发生,并且与大多数情况不同。DataGrid的DataGrid的具有在WPF

的对象的属性还可以是collection.So每个单元应该能够在自身中显示的子数据网格中,并且这可以延长高达第n级。

如何创建WPF这样一个DataGrid?

回答

1

你可以使用DataGrid控件,并可以将其设置的ItemSource到你想要的每一行中显示的数据的观察的集合。并且对于每一行,您还可以根据需要设置其内容模板。此内容模板的控件数据也可以使用绑定进行设置。

+0

的数据将是动态的。每次我们可以有不同的对象集合。 – Brij

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> 

希望这将有助于你.....

+0

PersonModel包含ObservableCollection类型的Collection属性? – Brij

+0

我试过你的解决方案,但它只显示一个属性(类型列表)的子数据网格。可以有多个属性可以在子数据网格中呈现。 – Brij

+0

对于List类型不止一个属性,上述解决方案将不起作用。 –

1

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

您可以创建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> 
+0

我试过所有的代码方法。没有成功。你有任何参考? – Brij

+0

@Brij我加了一个例子。 – mikehc