DataGrid row headers on right side of DataGrid

696 Views Asked by At

Is it possible to have the row headers of a DataGrid appear on the right side of the grid? I tried to find some control templates for DataGrid but none of them allows to change the position of the row headers. Thank you

Edit: in pictures, I want to turn this

enter image description here

into this

enter image description here

2

There are 2 best solutions below

0
amnesyc On BEST ANSWER

Not an ideal solution but a workaround, I ended up adding a column, binding it to whatever I want to put in the row header and style it to look like a row headers column.

1
Meer On

refrerence:http://blog.magnusmontin.net/2014/08/18/right-aligned-row-numbers-datagridrowheader-wpf/

enter image description here

 public class Country
  {
   public string Name { get; set; }
   public string Continent { get; set; }
  }
<DataGrid ItemsSource="{Binding Countries}" AutoGenerateColumns="False">
<DataGrid.Columns>
    <DataGridTextColumn Header="Country" Binding="{Binding Name}"/>
</DataGrid.Columns>
<DataGrid.RowHeaderTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding DataContext.Continent, 
                    RelativeSource={RelativeSource AncestorType=DataGridRow}}"></TextBlock>
    </DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.RowHeaderStyle>
    <Style TargetType="{x:Type DataGridRowHeader}">
        <!-- Override ControlTemplate -->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                    <Grid xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2">
                        <Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsPressed="{TemplateBinding IsPressed}"
                                                             IsHovered="{TemplateBinding IsMouseOver}" IsSelected="{TemplateBinding IsRowSelected}"
                                                             Orientation="Horizontal" Padding="{TemplateBinding Padding}"
                                                             SeparatorBrush="{TemplateBinding SeparatorBrush}"
                                                             SeparatorVisibility="{TemplateBinding SeparatorVisibility}"
                                                             HorizontalAlignment="Right">
                            <StackPanel Orientation="Horizontal">
                                <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                          VerticalAlignment="Center"/>
                                <Control SnapsToDevicePixels="False" Template="{Binding ValidationErrorTemplate, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGridRow}}}">
                                    <Control.Visibility>
                                        <Binding Path="(Validation.HasError)" RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGridRow}}">
                                            <Binding.Converter>
                                                <BooleanToVisibilityConverter/>
                                            </Binding.Converter>
                                        </Binding>
                                    </Control.Visibility>
                                </Control>
                            </StackPanel>
                        </Themes:DataGridHeaderBorder>
                        <Thumb x:Name="PART_TopHeaderGripper" VerticalAlignment="Top">
                            <Thumb.Style>
                                <Style TargetType="{x:Type Thumb}">
                                    <Setter Property="Height" Value="8"/>
                                    <Setter Property="Background" Value="Transparent"/>
                                    <Setter Property="Cursor" Value="SizeNS"/>
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type Thumb}">
                                                <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </Thumb.Style>
                        </Thumb>
                        <Thumb x:Name="PART_BottomHeaderGripper" VerticalAlignment="Bottom">
                            <Thumb.Style>
                                <Style TargetType="{x:Type Thumb}">
                                    <Setter Property="Height" Value="8"/>
                                    <Setter Property="Background" Value="Transparent"/>
                                    <Setter Property="Cursor" Value="SizeNS"/>
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type Thumb}">
                                                <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </Thumb.Style>
                        </Thumb>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.RowHeaderStyle>