Search code examples
wpfdatagridstyleswpfdatagridwpftoolkit

How to fix datagrid groupheader from scrolling


Hi i was looking to align my group headers horizontally.I had succeeded to do so but now the problem is that if i scroll horizontally my group headers are also scrolling.How to fix this.I want my group headers to be fixed and only my content to scroll

My code is given below.

Xaml

<Window.Resources>
    <local:Animals x:Key="animals"/>       

    <CollectionViewSource x:Key="cvs" Source="{Binding Source={StaticResource animals}, Path=AnimalList}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Category" />
            <scm:SortDescription PropertyName="Name" />
        </CollectionViewSource.SortDescriptions>
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Category"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

    <DataTemplate x:Key="animalTemplate">
        <TextBlock Text="{Binding Path=Name}" Foreground="MediumSeaGreen"/>
    </DataTemplate>
    <Style TargetType="{x:Type HeaderedContentControl}">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <StackPanel Orientation="Horizontal">
                            <ContentPresenter
                            Content="{TemplateBinding HeaderedContentControl.Header}"
                            ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                            ContentSource="Header" VerticalAlignment="Center">
                            </ContentPresenter>
                            <ContentPresenter                             
                            Content="{TemplateBinding ContentControl.Content}"
                            ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" />
                        </StackPanel>

                        <Separator HorizontalAlignment="Stretch" Grid.Row="1" Margin="-1"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Border Margin="30" BorderBrush="Blue" BorderThickness="2" Padding="10">
    <Controls:DataGrid ItemsSource="{Binding Source={StaticResource cvs}}" 
       ItemTemplate="{StaticResource animalTemplate}" Name="ic" Width="200" >

        <Controls:DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Margin" Value="0,0,0,5"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <HeaderedContentControl BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1" Margin="0,0,0,5" >
                                        <HeaderedContentControl.Header>
                                            <TextBlock FontSize="12" FontWeight="Bold" Width="100"
                                                                Text="{Binding Name}" Margin="5,0,0,0"/>
                                        </HeaderedContentControl.Header>
                                        <HeaderedContentControl.Content>
                                            <ItemsPresenter/>
                                        </HeaderedContentControl.Content>
                                    </HeaderedContentControl>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </Controls:DataGrid.GroupStyle>
    </Controls:DataGrid>
</Border>

Code

  public class Animal
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private Category category;

    public Category Category
    {
        get { return category; }
        set { category = value; }
    }

    public Animal(string name, Category category)
    {
        this.name = name;
        this.category = category;
    }
}

public enum Category
{
    Amphibians,
    Bears,
    BigCats,
    Canines,
    Primates,
    Spiders,
}

public class Animals
{
    private List<Animal> animalList;

    public IEnumerable<Animal> AnimalList
    {
        get { return animalList; }
    }

    public Animals()
    {
        animalList = new List<Animal>();
        animalList.Add(new Animal("California Newt", Category.Amphibians));
        animalList.Add(new Animal("Giant Panda", Category.Bears));
        animalList.Add(new Animal("Coyote", Category.Canines));
        animalList.Add(new Animal("Golden Silk Spider", Category.Spiders));
        animalList.Add(new Animal("Mandrill", Category.Primates));
        animalList.Add(new Animal("Black Bear", Category.Bears));
        animalList.Add(new Animal("Jaguar", Category.BigCats));
        animalList.Add(new Animal("Bornean Gibbon", Category.Primates));
        animalList.Add(new Animal("African Wildcat", Category.BigCats));
        animalList.Add(new Animal("Arctic Fox", Category.Canines));
        animalList.Add(new Animal("Tomato Frog", Category.Amphibians));
        animalList.Add(new Animal("Grizzly Bear", Category.Bears));
        animalList.Add(new Animal("Dingo", Category.Canines));
        animalList.Add(new Animal("Gorilla", Category.Primates));
        animalList.Add(new Animal("Green Tree Frog", Category.Amphibians));
        animalList.Add(new Animal("Bald Uakari", Category.Primates));
        animalList.Add(new Animal("Polar Bear", Category.Bears));
        animalList.Add(new Animal("Black Widow Spider", Category.Spiders));
        animalList.Add(new Animal("Bat-Eared Fox", Category.Canines));
        animalList.Add(new Animal("Cheetah", Category.BigCats));
        animalList.Add(new Animal("Cheetah", Category.Spiders));
    }
}

Please help in this regard..


Solution

  • Put a ScrollViewer around your DataGrid.
    I also removed the Width from the DataGrid.

    <Border Margin="30" BorderBrush="Blue" BorderThickness="2" Padding="10">
     <ScrollViewer HorizontalScrollBarVisibility="Auto" 
                   VerticalScrollBarVisibility="Auto">
         <DataGrid ItemsSource="{Binding Source={StaticResource cvs}}"         
                   ItemTemplate="{StaticResource animalTemplate}" 
                   Name="ic" >
         </DataGrid>
       </ScrollViewer>
    </Border>