2013-06-27 50 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