2011-10-06 9 views

risposta

2

Impostare ValidatesOnDataErrors e ValidatesOnExpcetions su False per l'associazione della cella. Nel caso in cui si desiderino le convalide, è necessario ovverare il modello di convalida per il controllo. Si prega di fare riferimento alla mia risposta qui - Validation Error Style in WPF, similar to Silverlight

+0

lo voglio per convalidare i dati. MA voglio cambiare lo stile predefinito del bordo rosso. –

+0

Ho aggiornato la mia risposta. Per favore guarda. –

1

Odiavo il bordo rosso perché è stato messo in adorner e adorners sedersi sulla parte superiore della finestra, il che significa che se il vostro elemento è parzialmente/totalmente nascosto da un altro elemento (simile è in una griglia) mostra ancora: (

Ciò non significava che non volevo alcuna personalizzazione, quindi posso ancora evidenziare i miei elementi in rosa, o cambiare il loro in primo piano e avere il clip DataGridCell correttamente Tutto ciò che si può fare usando un trigger di stile

Spero che questo aiuti!

<DataGrid.Resources> 
    <Style TargetType="{x:Type TextBlock}" x:Key="TextBlockErrorStyle"> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <!-- Just the adorned element means NO RED BORDER --> 
        <AdornedElementPlaceholder Name="controlWithError" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="Foreground" Value="Red"/> 
       <Setter Property="Background" Value="Pink"/> 
       <Setter Property="ToolTip" 
        Value="{Binding RelativeSource={RelativeSource Self}, 
        Path=(Validation.Errors)[0].ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.Resources> 

...

<DataGridTemplateColumn Header="Description" MinWidth="150"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=Description, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" 
         Style="{StaticResource ResourceKey=TextBlockErrorStyle}" 
         /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
1

Ho avuto questo stesso problema, ma nel mio caso non stavo usando IDataError o INotifyDataErrorInfo. Sto usando uno stile personalizzato ValidationRule e stili per gestire la mia logica di convalida e la presentazione. Stavo già utilizzando il DataGrid RowStyle per visualizzare uno stile personalizzato per la riga con errori, quindi ho pensato che sarebbe stato facile fare qualcosa di simile con DataGridCell.

Cose da notare:

  1. non si può semplicemente definire uno stile e impostare il DataGrid.CellStyle. Invece devi usare lo ElementStyle e/o lo EditingElementStyle.

  2. Lo stile TargetType deve corrispondere al tipo DataGridColumn utilizzato dalla cella. Così, per una DataGridComboBoxColumn la TargetType dovrebbe essere ComboBox

DataGrid XAML Colonna:

<DataGridComboBoxColumn Header="Column1" 
    ItemsSource="{Binding Path=Column1Path}" 
    DisplayMemberPath="Column1DisplayPath" 
    ElementStyle="{StaticResource DGComboColValidationStyle}" 
    EditingElementStyle="{StaticResource DGComboColValidationStyle}"> 

    <DataGridComboBoxColumn.SelectedItemBinding> 
     <Binding Path="Column1Path" UpdateSourceTrigger="LostFocus"> 
      <Binding.ValidationRules> 
       <Validation:CustomValidationRule ValidationStep="UpdatedValue" ValidatesOnTargetUpdated="True" /> 
      </Binding.ValidationRules> 
     </Binding> 
    </DataGridComboBoxColumn.SelectedItemBinding> 
</DataGridComboBoxColumn> 

Style Definitions

<Style x:Key="DGComboColValidationStyle" TargetType="{x:Type ComboBox}"> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Grid> 
        <Border BorderThickness="1" 
          BorderBrush="{Binding ElementName=adorner1, Path=DataContext[0].ErrorContent.ValidationType, Converter={StaticResource ValidationTypeColorConverter}}" 
          CornerRadius="3"> 
        </Border> 
        <AdornedElementPlaceholder Name="adorner1"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="DGTextColValidationStyle" TargetType="{x:Type TextBlock}"> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Grid> 
        <Border BorderThickness="1" 
          BorderBrush="{Binding ElementName=adorner2, Path=DataContext[0].ErrorContent.ValidationType, Converter={StaticResource ValidationTypeColorConverter}}" 
          CornerRadius="3"> 
        </Border> 
        <AdornedElementPlaceholder Name="adorner2"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="DGRowValidationStyle" TargetType="{x:Type DataGridRow}"> 
    <Setter Property="ValidationErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate x:Name="DGRowValidationTemplate"> 
       <Grid> 
        <Ellipse Width="12" Height="12" Stroke="Black" StrokeThickness="0.5" 
         Fill="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent.ValidationType, Converter={StaticResource ValidationTypeColorConverter}}"/> 
        <TextBlock FontWeight="Bold" Padding="4,0,0,0" 
         Margin="0" VerticalAlignment="Top" Foreground="White" Text="!" 
         ToolTip="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent.ValidationMessage}"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="BorderThickness" Value="2"/> 
      <Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent.ValidationType, Converter={StaticResource ValidationTypeColorConverter}}"/> 
     </Trigger> 
     <Trigger Property="Validation.HasError" Value="false"> 
      <Setter Property="BorderThickness" Value="0"/> 
      <Setter Property="BorderBrush" Value="Transparent" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<Style x:Key="DGCellStyle" TargetType="{x:Type DataGridCell}"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="false"> 
      <Setter Property="BorderThickness" Value="0"/> 
      <Setter Property="BorderBrush" Value="Transparent" /> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent.ValidationMessage}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Riferimento: http://social.msdn.microsoft.com/Forums/vstudio/en-US/6d2d6513-7bca-4359-a12b-46da3c380b0a/wpf-4-datagrid-editingelementstyle-and-validationerrortemplate-adorner-layer?forum=wpf

6

Si può solo aggiungere questa riga al vostro DataGrid:

<DataGrid Validation.ErrorTemplate="{x:Null}" /> 
Problemi correlati