Using RowDetailsTemplate might be useful to implement nested datagrids.
For example, your normal datagrid might look like this.
<data:DataGrid Name="ParentDG" AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected"> <data:DataGrid.Columns> <data:DataGridTextColumn Header="<<ColumnInfo>>" Binding="{Binding <<BindingInfo>>}" IsReadOnly="True" /> ... </data:DataGrid.Columns> <data:DataGrid.RowDetailsTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <data:DataGrid Name="NestedDG"></data:DataGrid> </StackPanel> </DataTemplate> </data:DataGrid.RowDetailsTemplate></data:DataGrid>
Note that the RowDetailsVisibilityMode is set to "VisibleWhenSelected". Thus, whenever you click on a row in the datagrid, the content of rowdetailstemplate is displayed.
The only plumbing left now is to set the datasource of the inner-grid. You can do that by following these steps:1. Create an event handler for "RowDetailsVisibilityChanged" event ParentDG.RowDetailsVisibilityChanged += new EventHandler<DataGridRowDetailsEventArgs>(ParentDG_RowDetailsVisibilityChanged);
2. Define the event handler to set the data-source for the inner-grid. void ParentDG_RowDetailsVisibilityChanged(object sender, DataGridRowDetailsEventArgs e) { DataGrid nestedGrid = (DataGrid)e.DetailsElement.FindName("NestedDG"); if (e.Row.DetailsVisibility == Visibility.Visible) { nestedGrid.ItemsSource = <<Set the item source for the nested grid here>>; } }
Note that we obtian the nested grid from the DetailsElement and set the item source for the nested datagrid.
SOURCE : By implementation in my project and also Silverlight Official Forum