Search code examples
wpfvisual-treevisualtreehelper

WPF 3.5 nested datagrid row details not showing in Visual Tree


So I build a nice nested datagrid that look something like this:

<dg:DataGrid x:Name="mainGrid"
                AutoGenerateColumns="False" 
                CanUserAddRows="False"
                AreRowDetailsFrozen="True"
                CanUserReorderColumns="False"
                CanUserResizeColumns="True"
                CanUserResizeRows="False"
                SelectionUnit="FullRow"
                RowDetailsVisibilityMode="VisibleWhenSelected">
                <dg:DataGrid.Columns>
                    <dg:DataGridTemplateColumn CanUserResize="False" CanUserSort="False" Width="36" IsReadOnly="False">
                        <dg:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="+" Width="28" Height="28" />
                            </DataTemplate>
                        </dg:DataGridTemplateColumn.CellTemplate>
                    </dg:DataGridTemplateColumn>
                    <dg:DataGridTemplateColumn>
                        <dg:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Grid>
                                    <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}"/>
                                </Grid>
                            </DataTemplate>
                        </dg:DataGridTemplateColumn.CellTemplate>
                    </dg:DataGridTemplateColumn>
                    <dg:DataGridTemplateColumn Header="Name" IsReadOnly="True" Width="582">
                        <dg:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Margin="5" VerticalAlignment="Center" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Default}" />
                            </DataTemplate>
                        </dg:DataGridTemplateColumn.CellTemplate>
                    </dg:DataGridTemplateColumn>
                    <dg:DataGridTemplateColumn Header="Status" IsReadOnly="True" Width="150">
                        <dg:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Margin="5" VerticalAlignment="Center" Text="{Binding Status, Mode=TwoWay, UpdateSourceTrigger=Default}" />
                            </DataTemplate>
                        </dg:DataGridTemplateColumn.CellTemplate>
                    </dg:DataGridTemplateColumn>
                    <dg:DataGridCheckBoxColumn Binding="{Binding IsSelected}"/>
                </dg:DataGrid.Columns>
                <dg:DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <dg:DataGrid x:Name="scondaryDatagrid" Margin="29,0,0,0" 
                            AutoGenerateColumns="False" 
                            CanUserAddRows="False"
                            AreRowDetailsFrozen="True"
                            CanUserReorderColumns="False"
                            CanUserResizeColumns="True"
                            CanUserResizeRows="False"
                            SelectionUnit="Cell"
                            RowDetailsVisibilityMode="VisibleWhenSelected"
                            ItemsSource="{Binding Grades, Mode=TwoWay}">
                            <dg:DataGrid.Columns>
                                <dg:DataGridTemplateColumn CanUserResize="False" CanUserSort="False" Width="32" IsReadOnly="True">
                                    <dg:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button Content="+" Width="28" Height="28" />
                                        </DataTemplate>
                                    </dg:DataGridTemplateColumn.CellTemplate>
                                </dg:DataGridTemplateColumn>
                                <dg:DataGridTemplateColumn CanUserResize="False" CanUserSort="False" Width="32" IsReadOnly="True">
                                    <dg:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Center" HorizontalContentAlignment="Center" />
                                        </DataTemplate>
                                    </dg:DataGridTemplateColumn.CellTemplate>
                                </dg:DataGridTemplateColumn>
                                <dg:DataGridTemplateColumn Header="Name" IsReadOnly="True" Width="550">
                                    <dg:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Margin="5" Text="{Binding Name, Mode=TwoWay}" VerticalAlignment="Center" />
                                        </DataTemplate>
                                    </dg:DataGridTemplateColumn.CellTemplate>
                                </dg:DataGridTemplateColumn>
                            </dg:DataGrid.Columns>
                            <dg:DataGrid.RowDetailsTemplate>
                                <DataTemplate>
                                    <dg:DataGrid Margin="25,0,0,0" 
                                        AutoGenerateColumns="False" 
                                        CanUserAddRows="False"
                                        AreRowDetailsFrozen="True"
                                        CanUserReorderColumns="False"
                                        CanUserResizeColumns="True"
                                        CanUserResizeRows="False"
                                        SelectionUnit="Cell"
                                        ItemsSource="{Binding Notes, Mode=TwoWay}">
                                        <dg:DataGrid.Columns>
                                            <dg:DataGridTemplateColumn CanUserResize="False" CanUserSort="False" Width="32" IsReadOnly="True">
                                                <dg:DataGridTemplateColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Center" />
                                                    </DataTemplate>
                                                </dg:DataGridTemplateColumn.CellTemplate>
                                            </dg:DataGridTemplateColumn>
                                            <dg:DataGridTemplateColumn Header="Note" IsReadOnly="True" Width="550">
                                                <dg:DataGridTemplateColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <TextBlock Margin="5" Text="{Binding Note, Mode=TwoWay}" VerticalAlignment="Center" />
                                                    </DataTemplate>
                                                </dg:DataGridTemplateColumn.CellTemplate>
                                            </dg:DataGridTemplateColumn>
                                        </dg:DataGrid.Columns>
                                    </dg:DataGrid>
                                </DataTemplate>
                            </dg:DataGrid.RowDetailsTemplate>
                        </dg:DataGrid>
                    </DataTemplate>
                </dg:DataGrid.RowDetailsTemplate>


            </dg:DataGrid>

Due to the RowDetailsVisibilityMode property when it is set to VisibleWhenSelected, the Node DataGridDetailsPresenter for the rows have 0 children. When the property is set to Visible I can see the DataGridDetailsPresenter children.

How can I force the inclusion of all the nodes in the Visual tree for when the RowDetailsVisibilityMode property is VisibleWhenSelected?

Any input is greatly appreciated.


Solution

  • What are you trying to accomplish?

    Unless the the RowDetails are visible they would not be in the Visual Tree unless could force their creation by setting the RowDetailsVisibilityMode to Visible but setting the RowDetails DataGrid visibility to Collapsed. This may not work. I don't know if the DataGrid would be in the Visual Tree if set to Collapsed in 3.5.