nathantruant
nathantruant

Reputation: 89

TextBlock in DataGridTemplateColumn.CellTemplate losing Validation Styles when scrolling

I have a data grid built using DataGridTemplateColumns. When a validation error exists, we are displaying it on the Textblock of the CellTemplate. When scrolling occurs, the error styling is lost after it scrolls off the page.

In my control resources:

<ControlTemplate x:Key="validationTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Foreground="Yellow" 
                       FontSize="20" 
                       VerticalAlignment="Center"
                       Margin="0,0,2,2">!</TextBlock>
            <Border Grid.Column="1" 
                    BorderBrush="Yellow" 
                    BorderThickness="1" 
                    Margin="0" 
                    Padding="0"
                    Height="19">
                <AdornedElementPlaceholder/>
            </Border>
        </Grid>
    </ControlTemplate>

<Style x:Key="TextBlockValidationStyle" TargetType="{x:Type TextBlock}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self},
                Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

And Within the DataGrid:

  <DataGridTemplateColumn Header="Destination Column">
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox IsEditable="True"
                                      IsTextSearchCaseSensitive="{Binding ElementName=caseSensitiveSearch, Path=IsChecked}"
                                      ItemsSource="{Binding AllSuggestedNames}"
                                      TextSearch.TextPath="SuggestedName"
                                      Text="{Binding ColumnMapping.DestinationColumnName, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Style="{StaticResource TextBlockValidationStyle}"
                                       Text="{Binding ColumnMapping.DestinationColumnName, 
                                                ValidatesOnDataErrors=True, 
                                                NotifyOnValidationError=True, 
                                                UpdateSourceTrigger=PropertyChanged}"
                                       Validation.ErrorTemplate="{StaticResource validationTemplate}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

Upvotes: 0

Views: 4375

Answers (1)

nathantruant
nathantruant

Reputation: 89

Solved it! Wrapping each CellTemplate's interior of their DataTemplate with an AdornerDecorator fixed it right up!

                        <DataTemplate>
                        <AdornerDecorator>
                            <TextBlock Style="{StaticResource TextBlockValidationStyle}"
                                   Text="{Binding ColumnMapping.DestinationColumnName, 
                                            ValidatesOnDataErrors=True, 
                                            NotifyOnValidationError=True, 
                                            UpdateSourceTrigger=PropertyChanged}"
                                   Validation.ErrorTemplate="{StaticResource validationTemplate}"/>
                        </AdornerDecorator>
                    </DataTemplate>

Upvotes: 3

Related Questions