This question is locked. New answers and comments are not allowed.
I found a couple of possible issues with the RowDetailsTemplate for the RadGridView. If the main grid resides in a ScrollViewer, scrolling does not appear to work correctly for the child grid. I created a bare-bones sample that can easily reproduce the issues (issues listed below). This sample just uses one page so you can just copy & paste the XAML & code behind to get it working. For other reasons, we need to use the RowDetailsTemplate (not ChildTableDefinitions) and also we need the parent grid encapsulated into a ScrollViewer (not scroll the parent grid). If you could let me know if there is anything I am doing wrong or if there is any work-around, it would be greatly appreciated. Thanks.
- Child grid vertical scroll does not actually scroll
- Margins/Padding do not appear to be taken into account when doing HorizontalAlignment=”Stretch” (you will notice that when the row expands, the parent grid is stretched horizontally – you see what looks to be an extra blank column)
XAML
| <UserControl x:Class="TestTelerikGrid.MainPage" |
| xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
| xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
| xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
| xmlns:telerikGridView="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.GridView" |
| mc:Ignorable="d" |
| Width="Auto" Height="Auto"> |
| <Grid x:Name="LayoutRoot"> |
| <ScrollViewer VerticalScrollBarVisibility="Visible"> |
| <telerikGridView:RadGridView x:Name="ParentGrid" |
| ItemsSource="{Binding ViewModelDetails, Mode=TwoWay}" |
| SelectedItem="{Binding ViewModelDetail, Mode=TwoWay}" |
| RowDetailsVisibilityMode="VisibleWhenSelected" |
| IsReadOnly="True" |
| ScrollViewer.HorizontalScrollBarVisibility="Visible" |
| ScrollViewer.VerticalScrollBarVisibility="Visible" |
| AutoGenerateColumns="False" |
| ColumnsWidthMode="Fill" |
| CanUserFreezeColumns="False" |
| GridLinesVisibility="None" |
| CanUserReorderColumns="False" |
| CanUserInsertRows="False" |
| CanUserResizeColumns="True" |
| ShowGroupPanel="True" |
| UseAlternateRowStyle="True" |
| RowIndicatorVisibility="Collapsed" |
| Width="Auto" |
| SelectionChanged="ParentGrid_SelectionChanged" |
| > |
| <telerikGridView:RadGridView.RowDetailsTemplate> |
| <DataTemplate> |
| <telerikGridView:RadGridView x:Name="DetailGrid" |
| ItemsSource="{Binding GridItemsDetail, Mode=TwoWay}" |
| SelectedItem="{Binding GridSelectedItemDetail, Mode=TwoWay}" |
| IsReadOnly="True" |
| AutoGenerateColumns="False" |
| CanUserFreezeColumns="False" |
| VerticalGridlinesVisibility="Collapsed" |
| GridLinesVisibility="Horizontal" |
| CanUserReorderColumns="False" |
| CanUserInsertRows="False" |
| ShowGroupPanel="True" |
| UseAlternateRowStyle="True" |
| RowIndicatorVisibility="Collapsed" |
| AutoExpandGroups="True" |
| Margin="5" |
| ScrollViewer.HorizontalScrollBarVisibility="Auto" |
| ScrollViewer.VerticalScrollBarVisibility="Visible" |
| ColumnsWidthMode="Fill" |
| ScrollMode="Deferred" |
| DataLoadMode="Asynchronous" |
| MaxHeight="350" |
| VirtualizingStackPanel.VirtualizationMode="Recycling"> |
| <telerikGridView:RadGridView.Columns> |
| <telerikGridView:GridViewDataColumn Header="ID" UniqueName="ID" TextWrapping="Wrap" Width="100"/> |
| <telerikGridView:GridViewDataColumn Header="Name" UniqueName="Name" TextWrapping="Wrap"/> |
| </telerikGridView:RadGridView.Columns> |
| </telerikGridView:RadGridView> |
| </DataTemplate> |
| </telerikGridView:RadGridView.RowDetailsTemplate> |
| <telerikGridView:RadGridView.Columns> |
| <telerikGridView:GridViewDataColumn Header="ID" UniqueName="ID" TextWrapping="Wrap" Width="100"/> |
| <telerikGridView:GridViewDataColumn Header="Name" UniqueName="Name" TextWrapping="Wrap"/> |
| </telerikGridView:RadGridView.Columns> |
| </telerikGridView:RadGridView> |
| </ScrollViewer> |
| </Grid> |
| </UserControl> |
Code Behind
| using System; |
| using System.Collections.Generic; |
| using System.Linq; |
| using System.Net; |
| using System.Windows; |
| using System.Windows.Controls; |
| using System.Windows.Documents; |
| using System.Windows.Input; |
| using System.Windows.Media; |
| using System.Windows.Media.Animation; |
| using System.Windows.Shapes; |
| using System.ComponentModel; |
| using System.Collections.ObjectModel; |
| using Telerik.Windows.Controls; |
| namespace TestTelerikGrid |
| { |
| public partial class MainPage : UserControl, INotifyPropertyChanged |
| { |
| public MainPageViewModel m_viewModel; |
| public MainPage() |
| { |
| InitializeComponent(); |
| m_viewModel = new MainPageViewModel(); |
| this.DataContext = m_viewModel; |
| ObservableCollection<MainPageDetailViewModel> items = new ObservableCollection<MainPageDetailViewModel>(); |
| for (int counter = 1; counter <= 10; counter++) |
| { |
| items.Add(new MainPageDetailViewModel() { ID = counter, Name = "Test Items " + counter.ToString() }); |
| } |
| m_viewModel.ViewModelDetails = items; |
| } |
| private void ParentGrid_SelectionChanged(object sender, Telerik.Windows.Controls.SelectionChangeEventArgs e) |
| { |
| if (e.AddedItems != null && e.AddedItems.Count > 0) |
| { |
| MainPageDetailViewModel model = e.AddedItems[0] as MainPageDetailViewModel; |
| if (model == null) { return; } |
| ObservableCollection<TestItemDetail> items = new ObservableCollection<TestItemDetail>(); |
| for (int counter = 1; counter <= 100; counter++) |
| { |
| items.Add(new TestItemDetail() { HeaderId = model.ID, ID = counter, Name = "Test Items " + counter.ToString() }); |
| } |
| model.GridItemsDetail = items; |
| } |
| } |
| #region INotifyPropertyChanged Members |
| public event PropertyChangedEventHandler PropertyChanged; |
| protected virtual void RaisePropertyChanged(string propertyName) |
| { |
| if (this.PropertyChanged != null) |
| { |
| this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); |
| } |
| } |
| #endregion |
| } |
| public class TestItemDetail |
| { |
| public int HeaderId { get; set; } |
| public int ID { get; set; } |
| public string Name { get; set; } |
| } |
| public class MainPageViewModel : INotifyPropertyChanged |
| { |
| private MainPageDetailViewModel m_viewModelDetail; |
| private ObservableCollection<MainPageDetailViewModel> m_viewModelDetails; |
| public ObservableCollection<MainPageDetailViewModel> ViewModelDetails |
| { |
| get { return m_viewModelDetails; } |
| set |
| { |
| m_viewModelDetails = value; |
| RaisePropertyChanged("ViewModelDetails"); |
| } |
| } |
| public MainPageDetailViewModel ViewModelDetail |
| { |
| get { return m_viewModelDetail; } |
| set |
| { |
| m_viewModelDetail = value; |
| RaisePropertyChanged("ViewModelDetail"); |
| } |
| } |
| #region INotifyPropertyChanged Members |
| public event PropertyChangedEventHandler PropertyChanged; |
| protected virtual void RaisePropertyChanged(string propertyName) |
| { |
| if (this.PropertyChanged != null) |
| { |
| this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); |
| } |
| } |
| #endregion |
| } |
| public class MainPageDetailViewModel : INotifyPropertyChanged |
| { |
| private TestItemDetail m_gridSelectedItemDetail; |
| private ObservableCollection<TestItemDetail> m_gridItemsDetail; |
| public TestItemDetail GridSelectedItemDetail |
| { |
| get { return m_gridSelectedItemDetail; } |
| set |
| { |
| m_gridSelectedItemDetail = value; |
| RaisePropertyChanged("GridSelectedItemDetail"); |
| } |
| } |
| public ObservableCollection<TestItemDetail> GridItemsDetail |
| { |
| get { return m_gridItemsDetail; } |
| set |
| { |
| m_gridItemsDetail = value; |
| RaisePropertyChanged("GridItemsDetail"); |
| } |
| } |
| public int ID { get; set; } |
| public string Name { get; set; } |
| #region INotifyPropertyChanged Members |
| public event PropertyChangedEventHandler PropertyChanged; |
| protected virtual void RaisePropertyChanged(string propertyName) |
| { |
| if (this.PropertyChanged != null) |
| { |
| this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); |
| } |
| } |
| #endregion |
| } |
| } |