ARTICLE

WPF DataGrid Style

Posted by Nipun Tomar Articles | WPF December 31, 2010
The DataGrid control provides a flexible way to display a collection of data in rows and columns. The DataGrid includes built-in column types and a template column for hosting custom content. The built-in row type includes a drop-down details section that you can use to display additional content below the cell values.
Reader Level:
Download Files:
 


The DataGrid control provides a flexible way to display a collection of data in rows and columns. The DataGrid includes built-in column types and a template column for hosting custom content. The built-in row type includes a drop-down details section that you can use to display additional content below the cell values.
Here is a simple style for WPF DataGrid that I want to share with all.

Style features:-
1. Rounded Border
2. Gradient DataGridColumnHeader with MouseOver effect
3. Custom ValidationErrorTemplate
4. DataGridRow MouseOver effect
5. DataGridCell IsSelected effect

1.png

 

<!--DataGrid -->

    <!--Style and template for the resize control on the DataGridColumnHeader.-->

    <Style x:Key="ColumnHeaderGripperStyle" TargetType="{x:Type Thumb}">

        <Setter Property="Width" Value="5" />

        <Setter Property="Background" Value="Transparent" />

        <Setter Property="Cursor" Value="SizeWE" />

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type Thumb}">

                    <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" />

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

 

    <!--Style and template for the DataGridColumnHeader.-->

    <Style TargetType="{x:Type DataGridColumnHeader}">

        <Setter Property="Background" Value="{DynamicResource NormalBorderBrush}"/>

        <Setter Property="Foreground" Value="{DynamicResource TextBrush}"/>

        <Setter Property="VerticalContentAlignment" Value="Center" />

        <Setter Property="Height" Value="30"/>

        <Setter Property="SeparatorBrush" Value="#FFC9CACA" />

        <Setter Property="FontSize" Value="14"/>

        <Setter Property="FontWeight" Value="SemiBold"/>

        <Setter Property="Padding" Value="4 0 0 0"/>

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">

                    <ControlTemplate.Resources>

                        <Storyboard x:Key="HoverOn">

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Hover" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="1"/>

                            </DoubleAnimationUsingKeyFrames>

                        </Storyboard>

                        <Storyboard x:Key="HoverOff">

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Hover" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0" />

                            </DoubleAnimationUsingKeyFrames>

                        </Storyboard>

                    </ControlTemplate.Resources>

                    <Grid Background='Transparent' >

                        <Grid.ColumnDefinitions>

                            <ColumnDefinition Width='Auto' />

                            <ColumnDefinition Width='Auto' />

                            <ColumnDefinition Width='*' />

                            <ColumnDefinition Width='Auto' />

                        </Grid.ColumnDefinitions>

                        <Rectangle x:Name="BackgroundRectangle" Grid.ColumnSpan="4" Grid.RowSpan="2"

                                   Fill="{StaticResource NormalBrush}" Stretch="Fill" Stroke="{StaticResource NormalBorderBrush}" StrokeThickness="1" />

                        <Rectangle x:Name="Hover" Grid.ColumnSpan="4" Grid.RowSpan="2" Stretch="Fill"

                                   Fill="{StaticResource MouseOverBrush}" Opacity="0" />

                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"

                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"

                                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"

                                                  Margin='{TemplateBinding Padding}'

                                                  Cursor="{TemplateBinding Cursor}"/>

                        <Path HorizontalAlignment="Left" x:Name="SortArrow" VerticalAlignment="Center"

                                      Width="8" Opacity="0" RenderTransformOrigin=".5,.5" Grid.Column="2" Grid.RowSpan="2" Fill="#FF000000" Stretch="Uniform" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z ">

                            <Path.RenderTransform>

                                <TransformGroup>

                                    <ScaleTransform ScaleX=".9" ScaleY=".9" x:Name="SortIconTransform" />

                                </TransformGroup>

                            </Path.RenderTransform>

                        </Path>

                        <Thumb x:Name="PART_LeftHeaderGripper" Grid.Column="0" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>

                        <Thumb x:Name="PART_RightHeaderGripper" Grid.Column="3" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>

                    </Grid>

                    <ControlTemplate.Triggers>

                        <Trigger Property="SortDirection" Value="Ascending">

                            <Setter TargetName="SortArrow" Property="Opacity" Value="1" />

                            <Setter TargetName="SortArrow" Property="RenderTransform">

                                <Setter.Value>

                                    <RotateTransform Angle="180" />

                                </Setter.Value>

                            </Setter>

                            <Setter TargetName="BackgroundRectangle" Property="Opacity" Value="1" />

                        </Trigger>

                        <Trigger Property="SortDirection" Value="Descending">

                            <Setter TargetName="SortArrow" Property="Opacity" Value="1" />

                            <Setter TargetName="BackgroundRectangle" Property="Opacity" Value="1" />

                        </Trigger>

                        <Trigger Property="IsMouseOver" Value="true">

                            <Trigger.EnterActions>

                                <BeginStoryboard Storyboard="{StaticResource HoverOn}"/>

                            </Trigger.EnterActions>

                            <Trigger.ExitActions>

                                <BeginStoryboard Storyboard="{StaticResource HoverOff}"/>

                            </Trigger.ExitActions>

                        </Trigger>

                    </ControlTemplate.Triggers>

                </ControlTemplate>

            </Setter.Value>

        </Setter>       

    </Style>

 

    <!--Style and template for the DataGridColumnHeadersPresenter.-->

    <Style TargetType="{x:Type DataGridColumnHeadersPresenter}">

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">

                    <Grid>

                        <DataGridColumnHeader x:Name="PART_FillerColumnHeader" IsHitTestVisible="False" />

                        <ItemsPresenter />

                    </Grid>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

 

    <Style x:Key="{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}" TargetType="{x:Type Button}">

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type Button}">

                    <Grid>

                        <Rectangle x:Name="Border" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" SnapsToDevicePixels="True"/>

                        <Polygon x:Name="Arrow" Fill="Black" HorizontalAlignment="Right" Margin="8,8,3,3" Opacity="0.15" Points="0,10 10,10 10,0" Stretch="Uniform" VerticalAlignment="Bottom"/>

                    </Grid>

                    <ControlTemplate.Triggers>

                        <Trigger Property="IsMouseOver" Value="True">

                            <Setter Property="Stroke" TargetName="Border" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>

                        </Trigger>

                        <Trigger Property="IsPressed" Value="True">

                            <Setter Property="Fill" TargetName="Border" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>

                        </Trigger>

                        <Trigger Property="IsEnabled" Value="False">

                            <Setter Property="Visibility" TargetName="Arrow" Value="Collapsed"/>

                        </Trigger>

                    </ControlTemplate.Triggers>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

 

    <Style TargetType="{x:Type DataGrid}">

        <Setter Property="Background" Value="{StaticResource ControlContentBrush}"/>

        <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected"/>

        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>

        <Setter Property="ScrollViewer.PanningMode" Value="Both"/>

        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>

        <Setter Property="Margin" Value="5"/>

        <Setter Property="BorderBrush" Value="{StaticResource NormalBorderBrush}" />

        <Setter Property="AlternatingRowBackground" Value="{StaticResource AlternateBackgroundBrush}"/>

        <Setter Property="HorizontalGridLinesBrush" Value="{StaticResource NormalBorderBrush}"/>

        <Setter Property="VerticalGridLinesBrush" Value="{StaticResource NormalBorderBrush}"/>

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type DataGrid}">

                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" CornerRadius="5" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">

                        <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">

                            <ScrollViewer.Template>

                                <ControlTemplate TargetType="{x:Type ScrollViewer}">

                                    <Grid>

                                        <Grid.ColumnDefinitions>

                                            <ColumnDefinition Width="Auto"/>

                                            <ColumnDefinition Width="*"/>

                                            <ColumnDefinition Width="Auto"/>

                                        </Grid.ColumnDefinitions>

                                        <Grid.RowDefinitions>

                                            <RowDefinition Height="Auto"/>

                                            <RowDefinition Height="*"/>

                                            <RowDefinition Height="Auto"/>

                                        </Grid.RowDefinitions>

                                        <Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>

                                        <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>

                                        <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" Grid.ColumnSpan="2" Grid.Row="1"/>

                                        <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" Maximum="{TemplateBinding ScrollableHeight}" Orientation="Vertical" Grid.Row="1" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/>

                                        <Grid Grid.Column="1" Grid.Row="2">

                                            <Grid.ColumnDefinitions>

                                                <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>

                                                <ColumnDefinition Width="*"/>

                                            </Grid.ColumnDefinitions>

                                            <ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>

                                        </Grid>

                                    </Grid>

                                </ControlTemplate>

                            </ScrollViewer.Template>

                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

                        </ScrollViewer>

                    </Border>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

        <Style.Triggers>

            <Trigger Property="IsGrouping" Value="true">

                <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>

            </Trigger>

        </Style.Triggers>

    </Style>

 

    <Style TargetType="{x:Type DataGridRow}">

        <Setter Property="SnapsToDevicePixels" Value="true"/>

        <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>

        <Setter Property="ValidationErrorTemplate">

            <Setter.Value>

                <ControlTemplate>

                    <Grid>

                        <Ellipse Width="12" Height="12" Margin="0 2 0 0"

                        Fill="Red" Stroke="Black" VerticalAlignment="Top"

                        StrokeThickness="0.5"/>

                        <TextBlock FontWeight="Bold" Padding="4,0,0,0"

                        VerticalAlignment="Top" Foreground="White" Text="!"

                        ToolTip="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"/>

                    </Grid>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

 

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type DataGridRow}">

                    <ControlTemplate.Resources>

                        <Storyboard x:Key="SelectedOn">

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="select_gradient" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1" />

                            </DoubleAnimationUsingKeyFrames>

                        </Storyboard>

                        <Storyboard x:Key="SelectedOff">

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="select_gradient" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0" />

                            </DoubleAnimationUsingKeyFrames>

                        </Storyboard>

                        <Storyboard x:Key="HoverOn">

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="hover_gradient" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0.85" />

                            </DoubleAnimationUsingKeyFrames>

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="highlight" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0.65" />

                            </DoubleAnimationUsingKeyFrames>

                        </Storyboard>

                        <Storyboard x:Key="HoverOff">

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="hover_gradient" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0" />

                            </DoubleAnimationUsingKeyFrames>

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="highlight" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0" />

                            </DoubleAnimationUsingKeyFrames>

                        </Storyboard>

                    </ControlTemplate.Resources>

                    <Border x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">

                        <SelectiveScrollingGrid>

                            <SelectiveScrollingGrid.ColumnDefinitions>

                                <ColumnDefinition Width="Auto"/>

                                <ColumnDefinition Width="*"/>

                            </SelectiveScrollingGrid.ColumnDefinitions>

                            <SelectiveScrollingGrid.RowDefinitions>

                                <RowDefinition Height="*"/>

                                <RowDefinition Height="Auto"/>

                            </SelectiveScrollingGrid.RowDefinitions>

 

                            <Rectangle x:Name="hover_gradient" Stroke="{DynamicResource FocusBrush}" StrokeThickness="1" RadiusX="1" RadiusY="1" Opacity="0" IsHitTestVisible="False" Grid.Column="1" Fill="{DynamicResource MouseOverBrush}"/>

                            <Rectangle x:Name="highlight" Margin="1" StrokeThickness="1" RadiusX="0.5" RadiusY="0.5" Opacity="0" IsHitTestVisible="False" Grid.Column="1" Stroke="{DynamicResource MouseOverHighlightBrush}" Fill="{DynamicResource MouseOverHighlightBrush}"/>

                            <Rectangle x:Name="select_gradient" Grid.Row="0" Grid.ColumnSpan="2" StrokeThickness="1" RadiusX="1" RadiusY="1" Opacity="0" IsHitTestVisible="False" Fill="{DynamicResource PressedBrush}" Stroke="{DynamicResource PressedBorderBrush}"/>

 

                            <DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

                            <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>

                            <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>

 

                        </SelectiveScrollingGrid>

                    </Border>

                    <ControlTemplate.Triggers>

                        <Trigger Property="IsMouseOver" Value="True" SourceName="DGR_Border">

                            <Trigger.ExitActions>

                                <BeginStoryboard Storyboard="{StaticResource HoverOff}" x:Name="HoverOff_BeginStoryboard" />

                            </Trigger.ExitActions>

                            <Trigger.EnterActions>

                                <BeginStoryboard Storyboard="{StaticResource HoverOn}" x:Name="HoverOn_BeginStoryboard" />

                            </Trigger.EnterActions>

                        </Trigger>

                        <Trigger Property="IsSelected" Value="true">

                            <Trigger.ExitActions>

                                <BeginStoryboard x:Name="SelectedOff_BeginStoryboard" Storyboard="{StaticResource SelectedOff}" />

                            </Trigger.ExitActions>

                            <Trigger.EnterActions>

                                <BeginStoryboard Storyboard="{StaticResource SelectedOn}" />

                            </Trigger.EnterActions>

                        </Trigger>

                    </ControlTemplate.Triggers>

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

 

    <Style TargetType="{x:Type DataGridCell}">

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type DataGridCell}">

                    <ControlTemplate.Resources>

                        <Storyboard x:Key="SelectedOn">

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="select_gradient" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1" />

                            </DoubleAnimationUsingKeyFrames>

                        </Storyboard>

                        <Storyboard x:Key="SelectedOff">

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="select_gradient" Storyboard.TargetProperty="(UIElement.Opacity)">

                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0" />

                            </DoubleAnimationUsingKeyFrames>

                        </Storyboard>

                    </ControlTemplate.Resources>

                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">

                        <Grid>

                            <Rectangle x:Name="select_gradient" Margin="-2 -1 -2 -1"  Grid.Column="1" StrokeThickness="1" RadiusX="1" RadiusY="1" Opacity="0" IsHitTestVisible="False" Fill="{DynamicResource PressedBrush}" Stroke="{DynamicResource PressedBorderBrush}"/>

                            <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

                        </Grid>

                    </Border>

                    <ControlTemplate.Triggers>

                        <Trigger Property="IsSelected" Value="true">

                            <Trigger.ExitActions>

                                <BeginStoryboard x:Name="SelectedOff_BeginStoryboard" Storyboard="{StaticResource SelectedOff}" />

                            </Trigger.ExitActions>

                            <Trigger.EnterActions>

                                <BeginStoryboard Storyboard="{StaticResource SelectedOn}" />

                            </Trigger.EnterActions>

                        </Trigger>

                    </ControlTemplate.Triggers>

                </ControlTemplate>

 

            </Setter.Value>

        </Setter>

    </Style>

    <BooleanToVisibilityConverter x:Key="bool2VisibilityConverter"/>

    <Style x:Key="RowHeaderGripperStyle" 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>

 

    <Style TargetType="{x:Type DataGridRowHeader}">

        <Setter Property="Width" Value="20"/>

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type DataGridRowHeader}">

                    <Grid>

                        <Microsoft_Windows_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}">

                            <StackPanel Orientation="Horizontal">

                                <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/>

                                <Control SnapsToDevicePixels="false" Template="{Binding ValidationErrorTemplate, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Visibility="{Binding (Validation.HasError), Converter={StaticResource bool2VisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}"/>

                            </StackPanel>

                        </Microsoft_Windows_Themes:DataGridHeaderBorder>

                        <Thumb x:Name="PART_TopHeaderGripper" Style="{StaticResource RowHeaderGripperStyle}" VerticalAlignment="Top"/>

                        <Thumb x:Name="PART_BottomHeaderGripper" Style="{StaticResource RowHeaderGripperStyle}" VerticalAlignment="Bottom"/>

                    </Grid>

                </ControlTemplate>

            </Setter.Value>

        </Setter>    </Style>



Login to add your contents and source code to this article
post comment
     

Nice work.

Posted by ali hassanabadi Dec 18, 2012

thank you very good

Posted by burak yilmaz Nov 27, 2012

Great article man

Posted by James li Nov 11, 2012

Nice article :) Thanks !!

Posted by Ramesh Durai Aug 09, 2012

Great! Thanks a lot!!!

Posted by Alma Muratovic Jul 10, 2012
COMMENT USING
PREMIUM SPONSORS
DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and add new content to existing PDF documents from within your applications.
Join a Chapter
SPONSORED BY
  • PDF reports have never been easier to create. With our included WYSIWYG Designer, you can layout your reports, set up your data source and let DynamicPDF ReportWriter do the rest.
Join a Chapter