2011-10-06 13 views

Respuesta

2

Establezca ValidatesOnDataErrors y ValidatesOnExpcetions en False para el enlace de su celda. En caso de que desee sus validaciones, debe superar la Plantilla de validación para su control. Por favor refiérase a mi respuesta aquí - Validation Error Style in WPF, similar to Silverlight

+0

lo quiero para validar los datos. PERO quiero cambiar el estilo de borde rojo predeterminado. –

+0

He actualizado mi respuesta. Por favor échale un vistazo. –

1

odiaba el borde rojo, ya que fue puesto en el embellecedor y adorners se sientan en la parte superior de la ventana, lo que significa que si su elemento es parcialmente/totalmente oculto por otro elemento (como se está en una cuadrícula) el adorno completo todavía muestra :(

Eso no significaba que no quisiera una personalización, así que aún puedo resaltar mis artículos en rosa, o cambiar su primer plano y hacer que el DataGridCell recortara correctamente todo apagado. Usted puede hacer esto mediante el uso de un disparador de estilo.

Espero que esto ayude!

<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

Tuve este mismo problema, pero en mi caso yo no utilizaba IDataError o INotifyDataErrorInfo. Estoy usando un ValidationRule personalizado y estilos para manejar mi lógica de validación y presentación. Ya estaba usando DataGrid RowStyle para mostrar un estilo personalizado para la fila que tiene errores, así que pensé que sería fácil hacer algo similar con DataGridCell.

A tener en cuenta:

  1. no se puede simplemente definir un estilo y establecer el DataGrid.CellStyle. En su lugar, debe usar ElementStyle y/o EditingElementStyle.

  2. El estilo TargetType tiene que coincidir con el tipo DataGridColumn que está utilizando la celda. Así que para una DataGridComboBoxColumn la TargetType debería ser ComboBox

DataGrid XAML Columna:

<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> 

Definiciones de estilo

<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> 

Referencia: 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

Usted puede añadir esta línea a su cuadrícula de datos:

<DataGrid Validation.ErrorTemplate="{x:Null}" /> 
Cuestiones relacionadas