【问题标题】:How to get rid of the red border when a DataGrid cell is invalid?当 DataGrid 单元格无效时如何消除红色边框?
【发布时间】:2011-12-02 10:19:02
【问题描述】:

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

    将 ValidatesOnDataErrors 和 ValidatesOnExpcetions 设置为 False 以绑定您的单元格。 如果您需要验证,则必须覆盖控件的验证模板。请在此处参考我的回答- Validation Error Style in WPF, similar to Silverlight

    【讨论】:

    • 我希望它验证数据。但是我想更改默认的红色边框样式。
    • 红线不仅烦人,而且即使它们不是无效的,它也会应用于所有 DataGridTemplateColumns,因为 WPF 调用它们 GetError(null) 而不是 GetError( 绑定属性的名称)。
    【解决方案2】:

    您可以将此行添加到您的 DataGrid:

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

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,但在我的情况下,我没有使用 IDataErrorINotifyDataErrorInfo。我正在使用自定义 ValidationRule 和样式来处理我的验证逻辑和演示。我已经在使用 DataGrid RowStyle 为有错误的行显示自定义样式,所以我认为使用 DataGridCell 做类似的事情会很容易。

        注意事项:

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

        2. 样式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>
        

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

        【讨论】:

        • 谢谢,似乎覆盖了 TextBlock 的属性“Validation.ErrorTemplate”就可以了。我不知道该控件有一个错误模板。
        【解决方案5】:

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

        但这并不意味着我不想进行一些自定义,所以我仍然可以用粉红色突出显示我的项目,或者更改它们的前景并让 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>
        

        ...

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-07
          • 2020-11-06
          • 2011-07-25
          • 1970-01-01
          • 2011-05-02
          • 1970-01-01
          相关资源
          最近更新 更多