Wpf 当DataGrid单元格无效时,如何消除红色边框?

Wpf 当DataGrid单元格无效时,如何消除红色边框?,wpf,Wpf,我该怎么做?我想消除每个无效数据网格单元格上显示的恼人的红色边框。将单元格绑定的ValidateSondaErrors和ValidatesOnExpcetions设置为False。 如果需要验证,则必须覆盖控件的验证模板。请参考我的答案- 我讨厌红色边框,因为它被放在装饰器中,装饰器位于窗口顶部,这意味着如果您的元素被另一个元素部分/完全隐藏(就像在网格中),则完整的装饰器仍然显示:( 但这并不意味着我不需要一些定制,所以我仍然可以用粉色突出显示我的项目,或者更改它们的前景,让DataGridC

我该怎么做?我想消除每个无效数据网格单元格上显示的恼人的红色边框。

将单元格绑定的ValidateSondaErrors和ValidatesOnExpcetions设置为False。 如果需要验证,则必须覆盖控件的验证模板。请参考我的答案-

我讨厌红色边框,因为它被放在装饰器中,装饰器位于窗口顶部,这意味着如果您的元素被另一个元素部分/完全隐藏(就像在网格中),则完整的装饰器仍然显示:(

但这并不意味着我不需要一些定制,所以我仍然可以用粉色突出显示我的项目,或者更改它们的前景,让DataGridCell正确地剪裁所有内容。你可以通过使用样式触发器来实现这一点

希望这有帮助

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


我也有同样的问题,但在我的例子中,我没有使用
IDataError
INotifyDataErrorInfo
。我使用自定义的
验证规则和样式来处理我的验证逻辑和表示。我已经在使用DataGrid
RowStyle
为有错误的行显示自定义样式,所以我认为用DataGridCell做类似的事情很容易

注意事项:

  • 您不能只定义样式并设置
    DataGrid.CellStyle
    。相反,您必须使用
    ElementStyle
    和/或
    EditingElementStyle

  • 样式
    TargetType
    必须与单元格使用的DataGridColumn类型匹配。因此,对于DataGridComboBoxColumn,
    TargetType
    应为
    ComboBox

  • DataGrid列XAML:

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

    您也可以检查这一点

    您只需将此行添加到数据网格:

    <DataGrid  Validation.ErrorTemplate="{x:Null}" />
    
    
    
    我想让它验证数据。但我想更改默认的红色边框样式。红线不仅令人讨厌,而且它会应用于所有DataGridTemplateColumns,即使它们不是无效的,只是因为WPF调用了GetError(null)而不是GetError(绑定属性的名称)。谢谢,似乎覆盖了TextBlock的peropery“Validation.ErrorTemplate”完成这个技巧。我不知道控件有一个错误模板。
    <DataGrid  Validation.ErrorTemplate="{x:Null}" />